1use crate::{Dialect, Operation, OperationKey};
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
16pub struct ConversionEdge {
17 pub source: OperationKey,
18 pub target: OperationKey,
19}
20
21const fn edge(
22 (source_operation, source_dialect): (Operation, Dialect),
23 (target_operation, target_dialect): (Operation, Dialect),
24) -> ConversionEdge {
25 ConversionEdge {
26 source: OperationKey {
27 operation: source_operation,
28 dialect: source_dialect,
29 },
30 target: OperationKey {
31 operation: target_operation,
32 dialect: target_dialect,
33 },
34 }
35}
36
37pub const CONVERSION_EDGES: &[ConversionEdge] = {
38 use Dialect::{
39 Claude as C, Gemini as G, OpenAi as R, OpenAiChat as H, OpenAiResponsesWebSocket as W,
40 };
41 use Operation::{GenerateContent as Generate, StreamGenerateContent as Stream, *};
42 &[
43 edge((ListModels, R), (ListModels, C)),
45 edge((ListModels, R), (ListModels, G)),
46 edge((ListModels, C), (ListModels, R)),
47 edge((ListModels, C), (ListModels, G)),
48 edge((ListModels, G), (ListModels, R)),
49 edge((ListModels, G), (ListModels, C)),
50 edge((GetModel, R), (GetModel, C)),
52 edge((GetModel, R), (GetModel, G)),
53 edge((GetModel, C), (GetModel, R)),
54 edge((GetModel, C), (GetModel, G)),
55 edge((GetModel, G), (GetModel, R)),
56 edge((GetModel, G), (GetModel, C)),
57 edge((CountTokens, R), (CountTokens, C)),
59 edge((CountTokens, R), (CountTokens, G)),
60 edge((CountTokens, C), (CountTokens, G)),
61 edge((CountTokens, G), (CountTokens, C)),
62 edge((Generate, R), (Generate, C)),
64 edge((Generate, R), (Generate, G)),
65 edge((Generate, R), (Generate, H)),
66 edge((Generate, R), (Stream, R)),
67 edge((Generate, R), (Stream, C)),
68 edge((Generate, R), (Stream, G)),
69 edge((Generate, R), (Stream, H)),
70 edge((Generate, R), (Stream, W)),
71 edge((Generate, C), (Generate, R)),
72 edge((Generate, C), (Generate, G)),
73 edge((Generate, C), (Generate, H)),
74 edge((Generate, C), (Stream, R)),
75 edge((Generate, C), (Stream, C)),
76 edge((Generate, C), (Stream, G)),
77 edge((Generate, C), (Stream, H)),
78 edge((Generate, G), (Generate, R)),
79 edge((Generate, G), (Generate, C)),
80 edge((Generate, G), (Generate, H)),
81 edge((Generate, G), (Stream, R)),
82 edge((Generate, G), (Stream, C)),
83 edge((Generate, G), (Stream, G)),
84 edge((Generate, G), (Stream, H)),
85 edge((Generate, H), (Generate, R)),
86 edge((Generate, H), (Generate, C)),
87 edge((Generate, H), (Generate, G)),
88 edge((Generate, H), (Stream, R)),
89 edge((Generate, H), (Stream, C)),
90 edge((Generate, H), (Stream, G)),
91 edge((Generate, H), (Stream, H)),
92 edge((Stream, R), (Generate, R)),
94 edge((Stream, R), (Generate, C)),
95 edge((Stream, R), (Generate, G)),
96 edge((Stream, R), (Generate, H)),
97 edge((Stream, R), (Stream, C)),
98 edge((Stream, R), (Stream, G)),
99 edge((Stream, R), (Stream, H)),
100 edge((Stream, R), (Stream, W)),
101 edge((Stream, C), (Generate, R)),
102 edge((Stream, C), (Generate, C)),
103 edge((Stream, C), (Generate, G)),
104 edge((Stream, C), (Generate, H)),
105 edge((Stream, C), (Stream, R)),
106 edge((Stream, C), (Stream, G)),
107 edge((Stream, C), (Stream, H)),
108 edge((Stream, C), (Stream, W)),
109 edge((Stream, H), (Generate, R)),
110 edge((Stream, H), (Generate, C)),
111 edge((Stream, H), (Generate, G)),
112 edge((Stream, H), (Generate, H)),
113 edge((Stream, H), (Stream, R)),
114 edge((Stream, H), (Stream, C)),
115 edge((Stream, H), (Stream, G)),
116 edge((Stream, H), (Stream, W)),
117 edge((Stream, G), (Generate, R)),
118 edge((Stream, G), (Generate, C)),
119 edge((Stream, G), (Generate, G)),
120 edge((Stream, G), (Generate, H)),
121 edge((Stream, G), (Stream, R)),
122 edge((Stream, G), (Stream, C)),
123 edge((Stream, G), (Stream, H)),
124 edge((Stream, G), (Stream, W)),
125 edge((GuardianReview, R), (Generate, R)),
127 edge((GuardianReview, R), (Generate, C)),
128 edge((GuardianReview, R), (Generate, G)),
129 edge((GuardianReview, R), (Generate, H)),
130 edge((GuardianClassify, R), (Generate, R)),
132 edge((GuardianClassify, R), (Generate, C)),
133 edge((GuardianClassify, R), (Generate, G)),
134 edge((GuardianClassify, R), (Generate, H)),
135 edge((CompactContent, R), (Generate, R)),
137 edge((CompactContent, R), (Generate, C)),
138 edge((CompactContent, R), (Generate, G)),
139 edge((CompactContent, R), (Generate, H)),
140 edge((SummarizeMemory, R), (Generate, R)),
142 edge((SummarizeMemory, R), (Generate, C)),
143 edge((SummarizeMemory, R), (Generate, G)),
144 edge((SummarizeMemory, R), (Generate, H)),
145 edge((WebSearch, R), (Generate, R)),
147 edge((WebSearch, R), (Generate, C)),
148 edge((WebSearch, R), (Generate, G)),
149 edge((CreateEmbedding, R), (CreateEmbedding, G)),
151 edge((CreateEmbedding, G), (CreateEmbedding, R)),
152 edge((BatchCreateEmbedding, G), (CreateEmbedding, R)),
154 edge((CreateImage, R), (Generate, G)),
156 edge((EditImage, R), (Generate, G)),
158 edge((CreateFile, R), (CreateFile, C)),
160 edge((CreateFile, R), (CreateFile, G)),
161 edge((CreateFile, C), (CreateFile, R)),
162 edge((CreateFile, C), (CreateFile, G)),
163 edge((CreateFile, G), (CreateFile, R)),
164 edge((CreateFile, G), (CreateFile, C)),
165 edge((ListFiles, R), (ListFiles, C)),
167 edge((ListFiles, R), (ListFiles, G)),
168 edge((ListFiles, C), (ListFiles, R)),
169 edge((ListFiles, C), (ListFiles, G)),
170 edge((ListFiles, G), (ListFiles, R)),
171 edge((ListFiles, G), (ListFiles, C)),
172 edge((RetrieveFile, R), (RetrieveFile, C)),
174 edge((RetrieveFile, R), (RetrieveFile, G)),
175 edge((RetrieveFile, C), (RetrieveFile, R)),
176 edge((RetrieveFile, C), (RetrieveFile, G)),
177 edge((RetrieveFile, G), (RetrieveFile, R)),
178 edge((RetrieveFile, G), (RetrieveFile, C)),
179 edge((RetrieveFileContent, R), (RetrieveFileContent, C)),
181 edge((RetrieveFileContent, R), (RetrieveFileContent, G)),
182 edge((RetrieveFileContent, C), (RetrieveFileContent, R)),
183 edge((RetrieveFileContent, C), (RetrieveFileContent, G)),
184 edge((RetrieveFileContent, G), (RetrieveFileContent, R)),
185 edge((RetrieveFileContent, G), (RetrieveFileContent, C)),
186 edge((DeleteFile, R), (DeleteFile, C)),
188 edge((DeleteFile, R), (DeleteFile, G)),
189 edge((DeleteFile, C), (DeleteFile, R)),
190 edge((DeleteFile, C), (DeleteFile, G)),
191 edge((DeleteFile, G), (DeleteFile, R)),
192 edge((DeleteFile, G), (DeleteFile, C)),
193 edge((CreateVideo, R), (CreateVideo, G)),
195 edge((RetrieveVideo, R), (RetrieveVideo, G)),
197 edge((DownloadVideoContent, R), (DownloadVideoContent, G)),
199 edge((Generate, W), (Generate, R)),
201 edge((Generate, W), (Generate, C)),
202 edge((Generate, W), (Generate, G)),
203 edge((Generate, W), (Generate, H)),
204 edge((Generate, W), (Stream, R)),
205 edge((Generate, W), (Stream, C)),
206 edge((Generate, W), (Stream, G)),
207 edge((Generate, W), (Stream, H)),
208 edge((Stream, W), (Generate, R)),
210 edge((Stream, W), (Generate, C)),
211 edge((Stream, W), (Generate, G)),
212 edge((Stream, W), (Generate, H)),
213 edge((Stream, W), (Stream, R)),
214 edge((Stream, W), (Stream, C)),
215 edge((Stream, W), (Stream, G)),
216 edge((Stream, W), (Stream, H)),
217 ]
218};
219
220pub fn is_conversion_edge(source: OperationKey, target: OperationKey) -> bool {
221 CONVERSION_EDGES.contains(&ConversionEdge { source, target })
222}
223
224pub fn conversion_targets(source: OperationKey) -> impl Iterator<Item = OperationKey> {
226 CONVERSION_EDGES
227 .iter()
228 .filter(move |edge| edge.source == source)
229 .map(|edge| edge.target)
230}