SPB Git

spb/zyquo-cloud Public MIT

Native macOS AI chat client for 12 cloud providers — your keys, every cloud model, one beautiful chat.

Swift 97.4% Shell 1.7% Makefile 1%

phase5: legendary cloud-Z app icon (SVG source, small-size + template variants), icns pipeline; phase2: full 195-model catalog from PROVIDERS.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
simon-pierre boucher committed 12 days ago (Jul 30, 2026) parent df86b13

Showing 10 changed files with +1,795 and −16

added Resources/AppIcon.icns +0 −0

Binary file not shown.

added Resources/MenuBarIcon.png +0 −0

Binary file not shown.

added Resources/MenuBarIcon@2x.png +0 −0

Binary file not shown.

modified Sources/ZyquoCloud/Services/ModelCatalogData.swift +1513 −16
@@ -5,37 +5,1534 @@
5 5 // Author: Simon-Pierre Boucher
6 6 // Mail: contact@spboucher.ai
7 7 //
8 // Built-in model catalog, generated from docs/PROVIDERS.md (2026-07-30).
9 // PLACEHOLDER seed — replaced by the full generated catalog before Phase 6.
10 // When research and reality disagree in Phase 7, update docs/PROVIDERS.md and
11 // this file together.
8 +// Built-in model catalog, generated from docs/PROVIDERS.md and the per-provider
9 +// research files in docs/research/ on 2026-07-30. This file and docs/PROVIDERS.md
10 +// are a single source of truth and MUST stay in sync: when Phase 7 verification
11 +// (or any later research pass) changes a model, update both together.
12 +//
13 +// Scope: chat-completions-capable chat models only. Embeddings, audio/TTS/ASR,
14 +// realtime, image/video generation, moderation, OCR, robotics, deep-research
15 +// agents, and Responses-API-only models are excluded by design.
12 16 //
13 17
14 18 import Foundation
15 19
16 20 enum ModelCatalogData {
17 static let all: [AIModel] = [
21 +
22 + // MARK: - Shared parameter-support presets
23 +
24 + /// OpenAI reasoning models (o-series, gpt-5.x reasoning variants): reject
25 + /// temperature/top_p/penalties, require max_completion_tokens, accept reasoning_effort.
26 + private static let openAIReasoning = ParameterSupport(
27 + temperature: false, topP: false,
28 + usesMaxCompletionTokens: true, reasoningEffort: true
29 + )
30 +
31 + // MARK: - OpenAI
32 +
33 + static let openai: [AIModel] = [
34 + // Flagship GPT-5.6 trio
35 + AIModel(
36 + id: "gpt-5.6-sol", provider: .openai, displayName: "GPT-5.6 Sol",
37 + contextWindow: 1_050_000, maxOutputTokens: 128_000,
38 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
39 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 30.00),
40 + parameterSupport: openAIReasoning,
41 + isRecommended: true
42 + ),
43 + AIModel(
44 + id: "gpt-5.6-terra", provider: .openai, displayName: "GPT-5.6 Terra",
45 + contextWindow: 1_050_000, maxOutputTokens: 128_000,
46 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
47 + pricing: ModelPricing(inputPerMTok: 2.50, outputPerMTok: 15.00),
48 + parameterSupport: openAIReasoning,
49 + isRecommended: true
50 + ),
51 + AIModel(
52 + id: "gpt-5.6-luna", provider: .openai, displayName: "GPT-5.6 Luna",
53 + contextWindow: 1_050_000, maxOutputTokens: 128_000,
54 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
55 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 6.00),
56 + parameterSupport: openAIReasoning
57 + ),
58 + AIModel(
59 + id: "chat-latest", provider: .openai, displayName: "ChatGPT Latest",
60 + contextWindow: 128_000, maxOutputTokens: nil,
61 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
62 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 30.00),
63 + parameterSupport: .openAIDefault
64 + ),
65 + // Current / recent GPT-5.x
66 + AIModel(
67 + id: "gpt-5.5", provider: .openai, displayName: "GPT-5.5",
68 + contextWindow: 400_000, maxOutputTokens: nil,
69 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
70 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 30.00),
71 + parameterSupport: openAIReasoning
72 + ),
73 + AIModel(
74 + id: "gpt-5.4", provider: .openai, displayName: "GPT-5.4",
75 + contextWindow: 400_000, maxOutputTokens: 128_000,
76 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
77 + pricing: ModelPricing(inputPerMTok: 2.50, outputPerMTok: 15.00),
78 + parameterSupport: openAIReasoning
79 + ),
80 + AIModel(
81 + id: "gpt-5.4-mini", provider: .openai, displayName: "GPT-5.4 mini",
82 + contextWindow: 400_000, maxOutputTokens: nil,
83 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
84 + pricing: ModelPricing(inputPerMTok: 0.75, outputPerMTok: 4.50),
85 + parameterSupport: openAIReasoning
86 + ),
87 + AIModel(
88 + id: "gpt-5.4-nano", provider: .openai, displayName: "GPT-5.4 nano",
89 + contextWindow: 400_000, maxOutputTokens: nil,
90 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
91 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 1.25),
92 + parameterSupport: openAIReasoning
93 + ),
94 + AIModel(
95 + id: "gpt-5.3-chat-latest", provider: .openai, displayName: "GPT-5.3 Chat Latest",
96 + contextWindow: 128_000, maxOutputTokens: nil,
97 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
98 + pricing: nil,
99 + parameterSupport: .openAIDefault
100 + ),
101 + AIModel(
102 + id: "gpt-5.2", provider: .openai, displayName: "GPT-5.2",
103 + contextWindow: 400_000, maxOutputTokens: 128_000,
104 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
105 + pricing: ModelPricing(inputPerMTok: 1.75, outputPerMTok: 14.00),
106 + parameterSupport: openAIReasoning
107 + ),
108 + AIModel(
109 + id: "gpt-5.2-chat-latest", provider: .openai, displayName: "GPT-5.2 Chat Latest",
110 + contextWindow: 128_000, maxOutputTokens: 16_000,
111 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
112 + pricing: ModelPricing(inputPerMTok: 1.75, outputPerMTok: 14.00),
113 + parameterSupport: .openAIDefault
114 + ),
115 + AIModel(
116 + id: "gpt-5.1", provider: .openai, displayName: "GPT-5.1",
117 + contextWindow: 400_000, maxOutputTokens: 128_000,
118 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
119 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 10.00),
120 + parameterSupport: openAIReasoning
121 + ),
122 + AIModel(
123 + id: "gpt-5.1-chat-latest", provider: .openai, displayName: "GPT-5.1 Chat Latest",
124 + contextWindow: 128_000, maxOutputTokens: 16_000,
125 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
126 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 10.00),
127 + parameterSupport: .openAIDefault
128 + ),
129 + AIModel(
130 + id: "gpt-5", provider: .openai, displayName: "GPT-5",
131 + contextWindow: 400_000, maxOutputTokens: 128_000,
132 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
133 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 10.00),
134 + parameterSupport: openAIReasoning
135 + ),
136 + AIModel(
137 + id: "gpt-5-mini", provider: .openai, displayName: "GPT-5 mini",
138 + contextWindow: 400_000, maxOutputTokens: 128_000,
139 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
140 + pricing: ModelPricing(inputPerMTok: 0.25, outputPerMTok: 2.00),
141 + parameterSupport: openAIReasoning
142 + ),
143 + AIModel(
144 + id: "gpt-5-nano", provider: .openai, displayName: "GPT-5 nano",
145 + contextWindow: 400_000, maxOutputTokens: 128_000,
146 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
147 + pricing: ModelPricing(inputPerMTok: 0.05, outputPerMTok: 0.40),
148 + parameterSupport: openAIReasoning
149 + ),
150 + AIModel(
151 + id: "gpt-5-chat-latest", provider: .openai, displayName: "GPT-5 Chat Latest",
152 + contextWindow: 128_000, maxOutputTokens: 16_000,
153 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
154 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 10.00),
155 + parameterSupport: .openAIDefault
156 + ),
157 + // o-series reasoning
158 + AIModel(
159 + id: "o3", provider: .openai, displayName: "OpenAI o3",
160 + contextWindow: 200_000, maxOutputTokens: 100_000,
161 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
162 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 8.00),
163 + parameterSupport: openAIReasoning
164 + ),
165 + AIModel(
166 + id: "o4-mini", provider: .openai, displayName: "OpenAI o4-mini",
167 + contextWindow: 200_000, maxOutputTokens: 100_000,
168 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
169 + pricing: ModelPricing(inputPerMTok: 1.10, outputPerMTok: 4.40),
170 + parameterSupport: openAIReasoning
171 + ),
18 172 AIModel(
19 id: "gpt-4o-mini",
20 provider: .openai,
21 displayName: "GPT-4o mini",
22 contextWindow: 128_000,
23 maxOutputTokens: 16_384,
173 + id: "o3-mini", provider: .openai, displayName: "OpenAI o3-mini",
174 + contextWindow: 200_000, maxOutputTokens: 100_000,
175 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
176 + pricing: ModelPricing(inputPerMTok: 1.10, outputPerMTok: 4.40),
177 + parameterSupport: openAIReasoning,
178 + isLegacy: true
179 + ),
180 + AIModel(
181 + id: "o1", provider: .openai, displayName: "OpenAI o1",
182 + contextWindow: 200_000, maxOutputTokens: 100_000,
183 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
184 + pricing: ModelPricing(inputPerMTok: 15.00, outputPerMTok: 60.00),
185 + parameterSupport: openAIReasoning,
186 + isLegacy: true
187 + ),
188 + // Legacy GPT-4.x / 3.5
189 + AIModel(
190 + id: "gpt-4.1", provider: .openai, displayName: "GPT-4.1",
191 + contextWindow: 1_047_576, maxOutputTokens: 32_768,
192 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
193 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 8.00),
194 + parameterSupport: .openAIDefault,
195 + isLegacy: true
196 + ),
197 + AIModel(
198 + id: "gpt-4.1-mini", provider: .openai, displayName: "GPT-4.1 mini",
199 + contextWindow: 1_047_576, maxOutputTokens: 32_768,
200 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
201 + pricing: ModelPricing(inputPerMTok: 0.40, outputPerMTok: 1.60),
202 + parameterSupport: .openAIDefault,
203 + isLegacy: true
204 + ),
205 + AIModel(
206 + id: "gpt-4.1-nano", provider: .openai, displayName: "GPT-4.1 nano",
207 + contextWindow: 1_047_576, maxOutputTokens: 32_768,
208 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
209 + pricing: ModelPricing(inputPerMTok: 0.10, outputPerMTok: 0.40),
210 + parameterSupport: .openAIDefault,
211 + isLegacy: true
212 + ),
213 + AIModel(
214 + id: "gpt-4o", provider: .openai, displayName: "GPT-4o",
215 + contextWindow: 128_000, maxOutputTokens: 16_384,
216 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
217 + pricing: ModelPricing(inputPerMTok: 2.50, outputPerMTok: 10.00),
218 + parameterSupport: .openAIDefault,
219 + isLegacy: true
220 + ),
221 + AIModel(
222 + id: "gpt-4o-mini", provider: .openai, displayName: "GPT-4o mini",
223 + contextWindow: 128_000, maxOutputTokens: 16_384,
24 224 capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
25 225 pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 0.60),
26 226 parameterSupport: .openAIDefault,
227 + isLegacy: true
228 + ),
229 + AIModel(
230 + id: "gpt-4-turbo", provider: .openai, displayName: "GPT-4 Turbo",
231 + contextWindow: 128_000, maxOutputTokens: 4_096,
232 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
233 + pricing: ModelPricing(inputPerMTok: 10.00, outputPerMTok: 30.00),
234 + parameterSupport: .openAIDefault,
235 + isLegacy: true
236 + ),
237 + AIModel(
238 + id: "gpt-4", provider: .openai, displayName: "GPT-4",
239 + contextWindow: 8_192, maxOutputTokens: 8_192,
240 + capabilities: ModelCapabilities(tools: true),
241 + pricing: ModelPricing(inputPerMTok: 30.00, outputPerMTok: 60.00),
242 + parameterSupport: .openAIDefault,
243 + isLegacy: true
244 + ),
245 + AIModel(
246 + id: "gpt-3.5-turbo", provider: .openai, displayName: "GPT-3.5 Turbo",
247 + contextWindow: 16_385, maxOutputTokens: 4_096,
248 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
249 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 1.50),
250 + parameterSupport: .openAIDefault,
251 + isLegacy: true
252 + ),
253 + ]
254 +
255 + // MARK: - Anthropic
256 +
257 + static let anthropic: [AIModel] = [
258 + AIModel(
259 + id: "claude-opus-5", provider: .anthropic, displayName: "Claude Opus 5",
260 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
261 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
262 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
263 + parameterSupport: ParameterSupport(temperature: false, topP: false, thinkingToggle: true),
27 264 isRecommended: true
28 265 ),
29 266 AIModel(
30 id: "claude-sonnet-5",
31 provider: .anthropic,
32 displayName: "Claude Sonnet 5",
33 contextWindow: 1_000_000,
34 maxOutputTokens: 128_000,
267 + id: "claude-sonnet-5", provider: .anthropic, displayName: "Claude Sonnet 5",
268 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
35 269 capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
36 pricing: ModelPricing(inputPerMTok: 2, outputPerMTok: 10),
270 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 15.00),
37 271 parameterSupport: ParameterSupport(temperature: false, topP: false, thinkingToggle: true),
38 272 isRecommended: true
39 273 ),
274 + AIModel(
275 + id: "claude-fable-5", provider: .anthropic, displayName: "Claude Fable 5",
276 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
277 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
278 + pricing: ModelPricing(inputPerMTok: 10.00, outputPerMTok: 50.00),
279 + // Thinking is always on and cannot be disabled — no toggle.
280 + parameterSupport: ParameterSupport(temperature: false, topP: false, thinkingToggle: false)
281 + ),
282 + AIModel(
283 + id: "claude-opus-4-8", provider: .anthropic, displayName: "Claude Opus 4.8",
284 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
285 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
286 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
287 + parameterSupport: ParameterSupport(temperature: false, topP: false, thinkingToggle: true)
288 + ),
289 + AIModel(
290 + id: "claude-opus-4-7", provider: .anthropic, displayName: "Claude Opus 4.7",
291 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
292 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
293 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
294 + parameterSupport: ParameterSupport(temperature: false, topP: false, thinkingToggle: true)
295 + ),
296 + AIModel(
297 + id: "claude-opus-4-6", provider: .anthropic, displayName: "Claude Opus 4.6",
298 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
299 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
300 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
301 + parameterSupport: ParameterSupport(temperature: true, topP: true, thinkingToggle: true)
302 + ),
303 + AIModel(
304 + id: "claude-sonnet-4-6", provider: .anthropic, displayName: "Claude Sonnet 4.6",
305 + contextWindow: 1_000_000, maxOutputTokens: 128_000,
306 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
307 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 15.00),
308 + parameterSupport: ParameterSupport(temperature: true, topP: true, thinkingToggle: true)
309 + ),
310 + AIModel(
311 + id: "claude-haiku-4-5-20251001", provider: .anthropic, displayName: "Claude Haiku 4.5",
312 + contextWindow: 200_000, maxOutputTokens: 64_000,
313 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
314 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 5.00),
315 + parameterSupport: ParameterSupport(temperature: true, topP: true, thinkingToggle: true)
316 + ),
317 + AIModel(
318 + id: "claude-opus-4-5-20251101", provider: .anthropic, displayName: "Claude Opus 4.5",
319 + contextWindow: 200_000, maxOutputTokens: 64_000,
320 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
321 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
322 + parameterSupport: ParameterSupport(temperature: true, topP: true, thinkingToggle: true),
323 + isLegacy: true
324 + ),
325 + AIModel(
326 + id: "claude-sonnet-4-5-20250929", provider: .anthropic, displayName: "Claude Sonnet 4.5",
327 + contextWindow: 1_000_000, maxOutputTokens: 64_000,
328 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
329 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 15.00),
330 + parameterSupport: ParameterSupport(temperature: true, topP: true, thinkingToggle: true),
331 + isLegacy: true
332 + ),
333 + AIModel(
334 + id: "claude-opus-4-1-20250805", provider: .anthropic, displayName: "Claude Opus 4.1",
335 + contextWindow: 200_000, maxOutputTokens: 32_000,
336 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
337 + pricing: ModelPricing(inputPerMTok: 15.00, outputPerMTok: 75.00),
338 + parameterSupport: ParameterSupport(temperature: true, topP: true, thinkingToggle: true),
339 + isLegacy: true
340 + ),
341 + ]
342 +
343 + // MARK: - xAI (Grok)
344 +
345 + static let xai: [AIModel] = [
346 + AIModel(
347 + id: "grok-4.5", provider: .xai, displayName: "Grok 4.5",
348 + contextWindow: 500_000, maxOutputTokens: nil,
349 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
350 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 6.00),
351 + parameterSupport: ParameterSupport(reasoningEffort: true),
352 + isRecommended: true
353 + ),
354 + AIModel(
355 + id: "grok-4.3", provider: .xai, displayName: "Grok 4.3",
356 + contextWindow: 1_000_000, maxOutputTokens: nil,
357 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
358 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 2.50),
359 + parameterSupport: ParameterSupport(reasoningEffort: true)
360 + ),
361 + AIModel(
362 + id: "grok-4.20", provider: .xai, displayName: "Grok 4.20 Reasoning",
363 + contextWindow: 1_000_000, maxOutputTokens: nil,
364 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
365 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 2.50),
366 + parameterSupport: ParameterSupport(reasoningEffort: true)
367 + ),
368 + AIModel(
369 + id: "grok-4.20-non-reasoning", provider: .xai, displayName: "Grok 4.20 Non-Reasoning",
370 + contextWindow: 1_000_000, maxOutputTokens: nil,
371 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
372 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 2.50),
373 + parameterSupport: ParameterSupport()
374 + ),
375 + AIModel(
376 + id: "grok-4.20-multi-agent", provider: .xai, displayName: "Grok 4.20 Multi-Agent",
377 + contextWindow: 1_000_000, maxOutputTokens: nil,
378 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
379 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 2.50),
380 + parameterSupport: ParameterSupport(reasoningEffort: true)
381 + ),
382 + AIModel(
383 + id: "grok-code-fast-1", provider: .xai, displayName: "Grok Code Fast 1",
384 + contextWindow: 256_000, maxOutputTokens: nil,
385 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
386 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 2.00),
387 + parameterSupport: ParameterSupport(reasoningEffort: true),
388 + isRecommended: true
389 + ),
390 + ]
391 +
392 + // MARK: - Mistral
393 +
394 + static let mistral: [AIModel] = [
395 + AIModel(
396 + id: "mistral-medium-latest", provider: .mistral, displayName: "Mistral Medium 3.5",
397 + contextWindow: 262_144, maxOutputTokens: nil,
398 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
399 + pricing: ModelPricing(inputPerMTok: 1.50, outputPerMTok: 7.50),
400 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, reasoningEffort: true),
401 + isRecommended: true
402 + ),
403 + AIModel(
404 + id: "mistral-large-latest", provider: .mistral, displayName: "Mistral Large 3",
405 + contextWindow: 262_144, maxOutputTokens: nil,
406 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
407 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 1.50),
408 + parameterSupport: .openAIDefault,
409 + isRecommended: true
410 + ),
411 + AIModel(
412 + id: "mistral-small-latest", provider: .mistral, displayName: "Mistral Small 4",
413 + contextWindow: 262_144, maxOutputTokens: nil,
414 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
415 + pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 0.60),
416 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, reasoningEffort: true),
417 + isRecommended: true
418 + ),
419 + AIModel(
420 + id: "codestral-latest", provider: .mistral, displayName: "Codestral",
421 + contextWindow: 256_000, maxOutputTokens: nil,
422 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
423 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 0.90),
424 + parameterSupport: .openAIDefault
425 + ),
426 + AIModel(
427 + id: "ministral-14b-latest", provider: .mistral, displayName: "Ministral 3 14B",
428 + contextWindow: 262_144, maxOutputTokens: nil,
429 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
430 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 0.20),
431 + parameterSupport: .openAIDefault
432 + ),
433 + AIModel(
434 + id: "ministral-8b-latest", provider: .mistral, displayName: "Ministral 3 8B",
435 + contextWindow: 262_144, maxOutputTokens: nil,
436 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
437 + pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 0.15),
438 + parameterSupport: .openAIDefault
439 + ),
440 + AIModel(
441 + id: "ministral-3b-latest", provider: .mistral, displayName: "Ministral 3 3B",
442 + contextWindow: 131_072, maxOutputTokens: nil,
443 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
444 + pricing: ModelPricing(inputPerMTok: 0.10, outputPerMTok: 0.10),
445 + parameterSupport: .openAIDefault
446 + ),
447 + // Legacy / deprecated (still served; hidden by default)
448 + AIModel(
449 + id: "magistral-medium-latest", provider: .mistral, displayName: "Magistral Medium",
450 + contextWindow: 131_072, maxOutputTokens: nil,
451 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
452 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 5.00),
453 + parameterSupport: .openAIDefault,
454 + isLegacy: true
455 + ),
456 + AIModel(
457 + id: "devstral-latest", provider: .mistral, displayName: "Devstral 2",
458 + contextWindow: 262_144, maxOutputTokens: nil,
459 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
460 + pricing: ModelPricing(inputPerMTok: 0.40, outputPerMTok: 2.00),
461 + parameterSupport: .openAIDefault,
462 + isLegacy: true
463 + ),
464 + AIModel(
465 + id: "open-mistral-nemo", provider: .mistral, displayName: "Mistral Nemo",
466 + contextWindow: 131_072, maxOutputTokens: nil,
467 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
468 + pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 0.15),
469 + parameterSupport: .openAIDefault,
470 + isLegacy: true
471 + ),
472 + ]
473 +
474 + // MARK: - Google Gemini
475 +
476 + static let gemini: [AIModel] = [
477 + AIModel(
478 + id: "gemini-3.6-flash", provider: .gemini, displayName: "Gemini 3.6 Flash",
479 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
480 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
481 + pricing: ModelPricing(inputPerMTok: 1.50, outputPerMTok: 7.50),
482 + parameterSupport: ParameterSupport(reasoningEffort: true),
483 + isRecommended: true
484 + ),
485 + AIModel(
486 + id: "gemini-3.5-flash", provider: .gemini, displayName: "Gemini 3.5 Flash",
487 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
488 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
489 + pricing: ModelPricing(inputPerMTok: 1.50, outputPerMTok: 9.00),
490 + parameterSupport: ParameterSupport(reasoningEffort: true)
491 + ),
492 + AIModel(
493 + id: "gemini-3.5-flash-lite", provider: .gemini, displayName: "Gemini 3.5 Flash-Lite",
494 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
495 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
496 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 2.50),
497 + parameterSupport: ParameterSupport(reasoningEffort: true),
498 + isRecommended: true
499 + ),
500 + AIModel(
501 + id: "gemini-3.1-pro-preview", provider: .gemini, displayName: "Gemini 3.1 Pro (Preview)",
502 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
503 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
504 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 12.00),
505 + parameterSupport: ParameterSupport(reasoningEffort: true),
506 + isRecommended: true
507 + ),
508 + AIModel(
509 + id: "gemini-3.1-flash-lite", provider: .gemini, displayName: "Gemini 3.1 Flash-Lite",
510 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
511 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
512 + pricing: ModelPricing(inputPerMTok: 0.25, outputPerMTok: 1.50),
513 + parameterSupport: ParameterSupport(reasoningEffort: true)
514 + ),
515 + AIModel(
516 + id: "gemini-2.5-pro", provider: .gemini, displayName: "Gemini 2.5 Pro",
517 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
518 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
519 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 10.00),
520 + parameterSupport: ParameterSupport(reasoningEffort: true)
521 + ),
522 + AIModel(
523 + id: "gemini-2.5-flash", provider: .gemini, displayName: "Gemini 2.5 Flash",
524 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
525 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
526 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 2.50),
527 + parameterSupport: ParameterSupport(reasoningEffort: true)
528 + ),
529 + AIModel(
530 + id: "gemini-2.5-flash-lite", provider: .gemini, displayName: "Gemini 2.5 Flash-Lite",
531 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
532 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
533 + pricing: ModelPricing(inputPerMTok: 0.10, outputPerMTok: 0.40),
534 + parameterSupport: ParameterSupport(reasoningEffort: true)
535 + ),
536 + // Rolling aliases (auto-track the latest release; pricing varies with target)
537 + AIModel(
538 + id: "gemini-pro-latest", provider: .gemini, displayName: "Gemini Pro (Latest)",
539 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
540 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
541 + pricing: nil,
542 + parameterSupport: ParameterSupport(reasoningEffort: true)
543 + ),
544 + AIModel(
545 + id: "gemini-flash-latest", provider: .gemini, displayName: "Gemini Flash (Latest)",
546 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
547 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
548 + pricing: nil,
549 + parameterSupport: ParameterSupport(reasoningEffort: true)
550 + ),
551 + AIModel(
552 + id: "gemini-flash-lite-latest", provider: .gemini, displayName: "Gemini Flash-Lite (Latest)",
553 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
554 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
555 + pricing: nil,
556 + parameterSupport: ParameterSupport(reasoningEffort: true)
557 + ),
558 + // Preview / secondary
559 + AIModel(
560 + id: "gemini-3-pro-preview", provider: .gemini, displayName: "Gemini 3 Pro (Preview)",
561 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
562 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
563 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 12.00),
564 + parameterSupport: ParameterSupport(reasoningEffort: true)
565 + ),
566 + AIModel(
567 + id: "gemini-3-flash-preview", provider: .gemini, displayName: "Gemini 3 Flash (Preview)",
568 + contextWindow: 1_048_576, maxOutputTokens: 65_536,
569 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
570 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 3.00),
571 + parameterSupport: ParameterSupport(reasoningEffort: true)
572 + ),
573 + AIModel(
574 + id: "gemini-2.0-flash", provider: .gemini, displayName: "Gemini 2.0 Flash",
575 + contextWindow: 1_048_576, maxOutputTokens: 8_192,
576 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
577 + pricing: ModelPricing(inputPerMTok: 0.10, outputPerMTok: 0.40),
578 + parameterSupport: ParameterSupport(),
579 + isLegacy: true
580 + ),
581 + AIModel(
582 + id: "gemini-2.0-flash-lite", provider: .gemini, displayName: "Gemini 2.0 Flash-Lite",
583 + contextWindow: 1_048_576, maxOutputTokens: 8_192,
584 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
585 + pricing: ModelPricing(inputPerMTok: 0.075, outputPerMTok: 0.30),
586 + parameterSupport: ParameterSupport(),
587 + isLegacy: true
588 + ),
589 + AIModel(
590 + id: "gemma-4-26b-a4b-it", provider: .gemini, displayName: "Gemma 4 26B",
591 + contextWindow: 262_144, maxOutputTokens: 32_768,
592 + capabilities: ModelCapabilities(jsonMode: true),
593 + pricing: nil,
594 + parameterSupport: ParameterSupport()
595 + ),
596 + AIModel(
597 + id: "gemma-4-31b-it", provider: .gemini, displayName: "Gemma 4 31B",
598 + contextWindow: 262_144, maxOutputTokens: 32_768,
599 + capabilities: ModelCapabilities(jsonMode: true),
600 + pricing: nil,
601 + parameterSupport: ParameterSupport()
602 + ),
40 603 ]
604 +
605 + // MARK: - Alibaba Qwen (DashScope)
606 +
607 + static let qwen: [AIModel] = [
608 + // Flagship commercial
609 + AIModel(
610 + id: "qwen3.7-max", provider: .qwen, displayName: "Qwen3.7 Max",
611 + contextWindow: 1_000_000, maxOutputTokens: nil,
612 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
613 + pricing: ModelPricing(inputPerMTok: 2.50, outputPerMTok: 7.50),
614 + parameterSupport: ParameterSupport(thinkingToggle: true),
615 + isRecommended: true
616 + ),
617 + AIModel(
618 + id: "qwen3.7-plus", provider: .qwen, displayName: "Qwen3.7 Plus",
619 + contextWindow: 1_000_000, maxOutputTokens: 65_536,
620 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
621 + pricing: ModelPricing(inputPerMTok: 0.32, outputPerMTok: 1.28),
622 + parameterSupport: ParameterSupport(thinkingToggle: true),
623 + isRecommended: true
624 + ),
625 + AIModel(
626 + id: "qwen3.7-flash", provider: .qwen, displayName: "Qwen3.7 Flash",
627 + contextWindow: 1_000_000, maxOutputTokens: 65_536,
628 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
629 + pricing: ModelPricing(inputPerMTok: 0.03, outputPerMTok: 0.13),
630 + parameterSupport: ParameterSupport(thinkingToggle: true),
631 + isRecommended: true
632 + ),
633 + AIModel(
634 + id: "qwen3.6-plus", provider: .qwen, displayName: "Qwen3.6 Plus",
635 + contextWindow: 1_000_000, maxOutputTokens: nil,
636 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
637 + pricing: nil,
638 + parameterSupport: ParameterSupport(thinkingToggle: true)
639 + ),
640 + AIModel(
641 + id: "qwen3.6-flash", provider: .qwen, displayName: "Qwen3.6 Flash",
642 + contextWindow: 1_000_000, maxOutputTokens: nil,
643 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
644 + pricing: nil,
645 + parameterSupport: ParameterSupport(thinkingToggle: true)
646 + ),
647 + AIModel(
648 + id: "qwen3.5-plus", provider: .qwen, displayName: "Qwen3.5 Plus",
649 + contextWindow: 1_000_000, maxOutputTokens: nil,
650 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
651 + pricing: nil,
652 + parameterSupport: ParameterSupport(thinkingToggle: true)
653 + ),
654 + AIModel(
655 + id: "qwen3.5-flash", provider: .qwen, displayName: "Qwen3.5 Flash",
656 + contextWindow: 1_000_000, maxOutputTokens: nil,
657 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
658 + pricing: nil,
659 + parameterSupport: ParameterSupport(thinkingToggle: true)
660 + ),
661 + // Stable aliases (previous-gen commercial)
662 + AIModel(
663 + id: "qwen-max", provider: .qwen, displayName: "Qwen Max",
664 + contextWindow: 128_000, maxOutputTokens: nil,
665 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
666 + pricing: nil,
667 + parameterSupport: ParameterSupport(thinkingToggle: true)
668 + ),
669 + AIModel(
670 + id: "qwen-plus", provider: .qwen, displayName: "Qwen Plus",
671 + contextWindow: 1_000_000, maxOutputTokens: nil,
672 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
673 + pricing: nil,
674 + parameterSupport: ParameterSupport(thinkingToggle: true)
675 + ),
676 + AIModel(
677 + id: "qwen-turbo", provider: .qwen, displayName: "Qwen Turbo",
678 + contextWindow: 1_000_000, maxOutputTokens: nil,
679 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
680 + pricing: nil,
681 + parameterSupport: ParameterSupport(thinkingToggle: true),
682 + isLegacy: true
683 + ),
684 + AIModel(
685 + id: "qwen-flash", provider: .qwen, displayName: "Qwen Flash",
686 + contextWindow: 1_000_000, maxOutputTokens: nil,
687 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
688 + pricing: nil,
689 + parameterSupport: ParameterSupport(thinkingToggle: true)
690 + ),
691 + // Coder family
692 + AIModel(
693 + id: "qwen3-coder-plus", provider: .qwen, displayName: "Qwen3 Coder Plus",
694 + contextWindow: 1_000_000, maxOutputTokens: nil,
695 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
696 + pricing: nil,
697 + parameterSupport: ParameterSupport()
698 + ),
699 + AIModel(
700 + id: "qwen3-coder-flash", provider: .qwen, displayName: "Qwen3 Coder Flash",
701 + contextWindow: 1_000_000, maxOutputTokens: nil,
702 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
703 + pricing: nil,
704 + parameterSupport: ParameterSupport()
705 + ),
706 + AIModel(
707 + id: "qwen3-coder-next", provider: .qwen, displayName: "Qwen3 Coder Next",
708 + contextWindow: 262_144, maxOutputTokens: nil,
709 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
710 + pricing: nil,
711 + parameterSupport: ParameterSupport()
712 + ),
713 + AIModel(
714 + id: "qwen3-coder-480b-a35b-instruct", provider: .qwen, displayName: "Qwen3 Coder 480B A35B",
715 + contextWindow: 262_144, maxOutputTokens: nil,
716 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
717 + pricing: nil,
718 + parameterSupport: ParameterSupport()
719 + ),
720 + // Vision-language
721 + AIModel(
722 + id: "qwen3-vl-plus", provider: .qwen, displayName: "Qwen3 VL Plus",
723 + contextWindow: 1_000_000, maxOutputTokens: 65_536,
724 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
725 + pricing: nil,
726 + parameterSupport: ParameterSupport(thinkingToggle: true)
727 + ),
728 + AIModel(
729 + id: "qwen3-vl-flash", provider: .qwen, displayName: "Qwen3 VL Flash",
730 + contextWindow: 1_000_000, maxOutputTokens: 65_536,
731 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
732 + pricing: nil,
733 + parameterSupport: ParameterSupport(thinkingToggle: true)
734 + ),
735 + AIModel(
736 + id: "qwen3-vl-235b-a22b-instruct", provider: .qwen, displayName: "Qwen3 VL 235B Instruct",
737 + contextWindow: 131_072, maxOutputTokens: nil,
738 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
739 + pricing: nil,
740 + parameterSupport: ParameterSupport()
741 + ),
742 + AIModel(
743 + id: "qwen3-vl-235b-a22b-thinking", provider: .qwen, displayName: "Qwen3 VL 235B Thinking",
744 + contextWindow: 131_072, maxOutputTokens: nil,
745 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
746 + pricing: nil,
747 + parameterSupport: ParameterSupport()
748 + ),
749 + AIModel(
750 + id: "qvq-max", provider: .qwen, displayName: "QVQ Max",
751 + contextWindow: 131_072, maxOutputTokens: nil,
752 + capabilities: ModelCapabilities(vision: true, reasoning: true, jsonMode: true),
753 + pricing: nil,
754 + parameterSupport: ParameterSupport()
755 + ),
756 + // Reasoning-only
757 + AIModel(
758 + id: "qwq-plus", provider: .qwen, displayName: "QwQ Plus",
759 + contextWindow: 131_072, maxOutputTokens: nil,
760 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
761 + pricing: nil,
762 + parameterSupport: ParameterSupport()
763 + ),
764 + // Open-weights Qwen hosted on DashScope
765 + AIModel(
766 + id: "qwen3.5-397b-a17b", provider: .qwen, displayName: "Qwen3.5 397B A17B",
767 + contextWindow: 262_144, maxOutputTokens: nil,
768 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
769 + pricing: nil,
770 + parameterSupport: ParameterSupport(thinkingToggle: true)
771 + ),
772 + AIModel(
773 + id: "qwen3.5-122b-a10b", provider: .qwen, displayName: "Qwen3.5 122B A10B",
774 + contextWindow: 262_144, maxOutputTokens: nil,
775 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
776 + pricing: nil,
777 + parameterSupport: ParameterSupport(thinkingToggle: true)
778 + ),
779 + AIModel(
780 + id: "qwen3.5-35b-a3b", provider: .qwen, displayName: "Qwen3.5 35B A3B",
781 + contextWindow: 262_144, maxOutputTokens: nil,
782 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
783 + pricing: nil,
784 + parameterSupport: ParameterSupport(thinkingToggle: true)
785 + ),
786 + AIModel(
787 + id: "qwen3-235b-a22b-instruct-2507", provider: .qwen, displayName: "Qwen3 235B Instruct 2507",
788 + contextWindow: 262_144, maxOutputTokens: nil,
789 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
790 + pricing: nil,
791 + parameterSupport: ParameterSupport()
792 + ),
793 + AIModel(
794 + id: "qwen3-235b-a22b-thinking-2507", provider: .qwen, displayName: "Qwen3 235B Thinking 2507",
795 + contextWindow: 262_144, maxOutputTokens: nil,
796 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
797 + pricing: nil,
798 + parameterSupport: ParameterSupport()
799 + ),
800 + AIModel(
801 + id: "qwen3-next-80b-a3b-instruct", provider: .qwen, displayName: "Qwen3 Next 80B Instruct",
802 + contextWindow: 262_144, maxOutputTokens: nil,
803 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
804 + pricing: nil,
805 + parameterSupport: ParameterSupport()
806 + ),
807 + AIModel(
808 + id: "qwen3-next-80b-a3b-thinking", provider: .qwen, displayName: "Qwen3 Next 80B Thinking",
809 + contextWindow: 262_144, maxOutputTokens: nil,
810 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
811 + pricing: nil,
812 + parameterSupport: ParameterSupport()
813 + ),
814 + // Third-party models hosted on DashScope
815 + AIModel(
816 + id: "deepseek-v4-pro", provider: .qwen, displayName: "DeepSeek V4 Pro (DashScope)",
817 + contextWindow: 1_000_000, maxOutputTokens: nil,
818 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
819 + pricing: nil,
820 + parameterSupport: ParameterSupport(thinkingToggle: true)
821 + ),
822 + AIModel(
823 + id: "deepseek-v4-flash", provider: .qwen, displayName: "DeepSeek V4 Flash (DashScope)",
824 + contextWindow: 1_000_000, maxOutputTokens: nil,
825 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
826 + pricing: nil,
827 + parameterSupport: ParameterSupport(thinkingToggle: true)
828 + ),
829 + AIModel(
830 + id: "glm-5.2", provider: .qwen, displayName: "GLM 5.2 (DashScope)",
831 + contextWindow: 198_000, maxOutputTokens: nil,
832 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
833 + pricing: nil,
834 + parameterSupport: ParameterSupport(thinkingToggle: true)
835 + ),
836 + AIModel(
837 + id: "kimi-k2.7-code", provider: .qwen, displayName: "Kimi K2.7 Code (DashScope)",
838 + contextWindow: 262_144, maxOutputTokens: nil,
839 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
840 + pricing: nil,
841 + parameterSupport: ParameterSupport(thinkingToggle: true)
842 + ),
843 + ]
844 +
845 + // MARK: - DeepSeek
846 +
847 + static let deepseek: [AIModel] = [
848 + AIModel(
849 + id: "deepseek-v4-flash", provider: .deepseek, displayName: "DeepSeek V4 Flash",
850 + contextWindow: 1_000_000, maxOutputTokens: 384_000,
851 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
852 + pricing: ModelPricing(inputPerMTok: 0.14, outputPerMTok: 0.28),
853 + parameterSupport: ParameterSupport(reasoningEffort: true, thinkingToggle: true),
854 + isRecommended: true
855 + ),
856 + AIModel(
857 + id: "deepseek-v4-pro", provider: .deepseek, displayName: "DeepSeek V4 Pro",
858 + contextWindow: 1_000_000, maxOutputTokens: 384_000,
859 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
860 + pricing: ModelPricing(inputPerMTok: 0.435, outputPerMTok: 0.87),
861 + parameterSupport: ParameterSupport(reasoningEffort: true, thinkingToggle: true),
862 + isRecommended: true
863 + ),
864 + ]
865 +
866 + // MARK: - Kimi (Moonshot AI)
867 +
868 + static let kimi: [AIModel] = [
869 + AIModel(
870 + id: "kimi-k3", provider: .kimi, displayName: "Kimi K3",
871 + contextWindow: 1_048_576, maxOutputTokens: 131_072,
872 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
873 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 15.00),
874 + // Thinking always on with preserved thinking; depth via reasoning_effort.
875 + parameterSupport: ParameterSupport(temperature: false, topP: false, usesMaxCompletionTokens: true, reasoningEffort: true),
876 + isRecommended: true
877 + ),
878 + AIModel(
879 + id: "kimi-k2.7-code", provider: .kimi, displayName: "Kimi K2.7 Code",
880 + contextWindow: 262_144, maxOutputTokens: nil,
881 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
882 + pricing: ModelPricing(inputPerMTok: 0.95, outputPerMTok: 4.00),
883 + parameterSupport: ParameterSupport(temperature: false, topP: false, usesMaxCompletionTokens: true),
884 + isRecommended: true
885 + ),
886 + AIModel(
887 + id: "kimi-k2.7-code-highspeed", provider: .kimi, displayName: "Kimi K2.7 Code Highspeed",
888 + contextWindow: 262_144, maxOutputTokens: nil,
889 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
890 + pricing: ModelPricing(inputPerMTok: 1.90, outputPerMTok: 8.00),
891 + parameterSupport: ParameterSupport(temperature: false, topP: false, usesMaxCompletionTokens: true)
892 + ),
893 + AIModel(
894 + id: "kimi-k2.6", provider: .kimi, displayName: "Kimi K2.6",
895 + contextWindow: 262_144, maxOutputTokens: nil,
896 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
897 + pricing: ModelPricing(inputPerMTok: 0.95, outputPerMTok: 4.00),
898 + parameterSupport: ParameterSupport(temperature: false, topP: false, usesMaxCompletionTokens: true, thinkingToggle: true)
899 + ),
900 + AIModel(
901 + id: "kimi-k2.5", provider: .kimi, displayName: "Kimi K2.5",
902 + contextWindow: 262_144, maxOutputTokens: nil,
903 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
904 + pricing: ModelPricing(inputPerMTok: 0.60, outputPerMTok: 3.00),
905 + parameterSupport: ParameterSupport(temperature: false, topP: false, usesMaxCompletionTokens: true, thinkingToggle: true)
906 + ),
907 + // Legacy moonshot-v1 "classic" series (temperature capped at 1.0)
908 + AIModel(
909 + id: "moonshot-v1-8k", provider: .kimi, displayName: "Moonshot v1 8K",
910 + contextWindow: 8_192, maxOutputTokens: nil,
911 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
912 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 2.00),
913 + parameterSupport: .openAIDefault,
914 + isLegacy: true
915 + ),
916 + AIModel(
917 + id: "moonshot-v1-32k", provider: .kimi, displayName: "Moonshot v1 32K",
918 + contextWindow: 32_768, maxOutputTokens: nil,
919 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
920 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 3.00),
921 + parameterSupport: .openAIDefault,
922 + isLegacy: true
923 + ),
924 + AIModel(
925 + id: "moonshot-v1-128k", provider: .kimi, displayName: "Moonshot v1 128K",
926 + contextWindow: 131_072, maxOutputTokens: nil,
927 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
928 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 5.00),
929 + parameterSupport: .openAIDefault,
930 + isLegacy: true
931 + ),
932 + AIModel(
933 + id: "moonshot-v1-auto", provider: .kimi, displayName: "Moonshot v1 Auto",
934 + contextWindow: 131_072, maxOutputTokens: nil,
935 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
936 + pricing: nil,
937 + parameterSupport: .openAIDefault,
938 + isLegacy: true
939 + ),
940 + AIModel(
941 + id: "moonshot-v1-8k-vision-preview", provider: .kimi, displayName: "Moonshot v1 8K Vision",
942 + contextWindow: 8_192, maxOutputTokens: nil,
943 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
944 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 2.00),
945 + parameterSupport: .openAIDefault,
946 + isLegacy: true
947 + ),
948 + AIModel(
949 + id: "moonshot-v1-32k-vision-preview", provider: .kimi, displayName: "Moonshot v1 32K Vision",
950 + contextWindow: 32_768, maxOutputTokens: nil,
951 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
952 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 3.00),
953 + parameterSupport: .openAIDefault,
954 + isLegacy: true
955 + ),
956 + AIModel(
957 + id: "moonshot-v1-128k-vision-preview", provider: .kimi, displayName: "Moonshot v1 128K Vision",
958 + contextWindow: 131_072, maxOutputTokens: nil,
959 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
960 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 5.00),
961 + parameterSupport: .openAIDefault,
962 + isLegacy: true
963 + ),
964 + ]
965 +
966 + // MARK: - Perplexity
967 +
968 + static let perplexity: [AIModel] = [
969 + AIModel(
970 + id: "sonar", provider: .perplexity, displayName: "Sonar",
971 + contextWindow: 128_000, maxOutputTokens: 128_000,
972 + capabilities: ModelCapabilities(jsonMode: true, citations: true),
973 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 1.00),
974 + parameterSupport: ParameterSupport(),
975 + isRecommended: true
976 + ),
977 + AIModel(
978 + id: "sonar-pro", provider: .perplexity, displayName: "Sonar Pro",
979 + contextWindow: 200_000, maxOutputTokens: 8_000,
980 + capabilities: ModelCapabilities(jsonMode: true, citations: true),
981 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 15.00),
982 + parameterSupport: ParameterSupport(),
983 + isRecommended: true
984 + ),
985 + AIModel(
986 + id: "sonar-reasoning-pro", provider: .perplexity, displayName: "Sonar Reasoning Pro",
987 + contextWindow: 128_000, maxOutputTokens: nil,
988 + capabilities: ModelCapabilities(reasoning: true, jsonMode: true, citations: true),
989 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 8.00),
990 + parameterSupport: ParameterSupport(reasoningEffort: true)
991 + ),
992 + AIModel(
993 + id: "sonar-deep-research", provider: .perplexity, displayName: "Sonar Deep Research",
994 + contextWindow: 128_000, maxOutputTokens: nil,
995 + capabilities: ModelCapabilities(reasoning: true, jsonMode: true, citations: true),
996 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 8.00),
997 + parameterSupport: ParameterSupport(reasoningEffort: true)
998 + ),
999 + ]
1000 +
1001 + // MARK: - Together AI
1002 +
1003 + static let together: [AIModel] = [
1004 + AIModel(
1005 + id: "moonshotai/Kimi-K3", provider: .together, displayName: "Kimi K3",
1006 + contextWindow: 1_000_000, maxOutputTokens: nil,
1007 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1008 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 15.00),
1009 + parameterSupport: .openAIDefault,
1010 + isRecommended: true
1011 + ),
1012 + AIModel(
1013 + id: "moonshotai/Kimi-K2.7-Code", provider: .together, displayName: "Kimi K2.7 Code",
1014 + contextWindow: 262_144, maxOutputTokens: nil,
1015 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1016 + pricing: ModelPricing(inputPerMTok: 0.95, outputPerMTok: 4.00),
1017 + parameterSupport: .openAIDefault
1018 + ),
1019 + AIModel(
1020 + id: "moonshotai/Kimi-K2.6", provider: .together, displayName: "Kimi K2.6",
1021 + contextWindow: 262_144, maxOutputTokens: nil,
1022 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1023 + pricing: ModelPricing(inputPerMTok: 1.20, outputPerMTok: 4.50),
1024 + parameterSupport: .openAIDefault
1025 + ),
1026 + AIModel(
1027 + id: "deepseek-ai/DeepSeek-V4-Pro", provider: .together, displayName: "DeepSeek V4 Pro",
1028 + contextWindow: 512_000, maxOutputTokens: nil,
1029 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1030 + pricing: ModelPricing(inputPerMTok: 1.74, outputPerMTok: 3.48),
1031 + parameterSupport: .openAIDefault,
1032 + isRecommended: true
1033 + ),
1034 + AIModel(
1035 + id: "deepseek-ai/DeepSeek-V3.1", provider: .together, displayName: "DeepSeek V3.1",
1036 + contextWindow: 131_072, maxOutputTokens: nil,
1037 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1038 + pricing: ModelPricing(inputPerMTok: 0.60, outputPerMTok: 1.70),
1039 + parameterSupport: .openAIDefault
1040 + ),
1041 + AIModel(
1042 + id: "deepseek-ai/DeepSeek-R1-0528", provider: .together, displayName: "DeepSeek R1 0528",
1043 + contextWindow: 163_840, maxOutputTokens: nil,
1044 + capabilities: ModelCapabilities(reasoning: true),
1045 + pricing: ModelPricing(inputPerMTok: 3.00, outputPerMTok: 7.00),
1046 + parameterSupport: .openAIDefault
1047 + ),
1048 + AIModel(
1049 + id: "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", provider: .together, displayName: "DeepSeek R1 Distill Llama 70B",
1050 + contextWindow: 131_072, maxOutputTokens: nil,
1051 + capabilities: ModelCapabilities(reasoning: true),
1052 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 2.00),
1053 + parameterSupport: .openAIDefault
1054 + ),
1055 + AIModel(
1056 + id: "zai-org/GLM-5.2", provider: .together, displayName: "GLM 5.2",
1057 + contextWindow: 512_000, maxOutputTokens: nil,
1058 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1059 + pricing: ModelPricing(inputPerMTok: 1.40, outputPerMTok: 4.40),
1060 + parameterSupport: .openAIDefault
1061 + ),
1062 + AIModel(
1063 + id: "zai-org/GLM-5.1", provider: .together, displayName: "GLM 5.1",
1064 + contextWindow: 202_752, maxOutputTokens: nil,
1065 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1066 + pricing: ModelPricing(inputPerMTok: 1.40, outputPerMTok: 4.40),
1067 + parameterSupport: .openAIDefault
1068 + ),
1069 + AIModel(
1070 + id: "zai-org/GLM-5", provider: .together, displayName: "GLM 5",
1071 + contextWindow: 202_752, maxOutputTokens: nil,
1072 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1073 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 3.20),
1074 + parameterSupport: .openAIDefault
1075 + ),
1076 + AIModel(
1077 + id: "zai-org/GLM-4.7", provider: .together, displayName: "GLM 4.7",
1078 + contextWindow: 202_752, maxOutputTokens: nil,
1079 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1080 + pricing: ModelPricing(inputPerMTok: 0.45, outputPerMTok: 2.00),
1081 + parameterSupport: .openAIDefault
1082 + ),
1083 + AIModel(
1084 + id: "Qwen/Qwen3.7-Max", provider: .together, displayName: "Qwen3.7 Max",
1085 + contextWindow: 1_000_000, maxOutputTokens: nil,
1086 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1087 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 3.75),
1088 + parameterSupport: .openAIDefault
1089 + ),
1090 + AIModel(
1091 + id: "Qwen/Qwen3.7-Plus", provider: .together, displayName: "Qwen3.7 Plus",
1092 + contextWindow: 1_000_000, maxOutputTokens: nil,
1093 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1094 + pricing: ModelPricing(inputPerMTok: 0.32, outputPerMTok: 1.28),
1095 + parameterSupport: .openAIDefault
1096 + ),
1097 + AIModel(
1098 + id: "Qwen/Qwen3.6-Plus", provider: .together, displayName: "Qwen3.6 Plus",
1099 + contextWindow: 1_000_000, maxOutputTokens: nil,
1100 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1101 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 3.00),
1102 + parameterSupport: .openAIDefault
1103 + ),
1104 + AIModel(
1105 + id: "Qwen/Qwen3.5-397B-A17B", provider: .together, displayName: "Qwen3.5 397B A17B",
1106 + contextWindow: 262_144, maxOutputTokens: nil,
1107 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1108 + pricing: ModelPricing(inputPerMTok: 0.60, outputPerMTok: 3.60),
1109 + parameterSupport: .openAIDefault
1110 + ),
1111 + AIModel(
1112 + id: "Qwen/Qwen3.5-9B", provider: .together, displayName: "Qwen3.5 9B",
1113 + contextWindow: 262_144, maxOutputTokens: nil,
1114 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1115 + pricing: ModelPricing(inputPerMTok: 0.17, outputPerMTok: 0.25),
1116 + parameterSupport: .openAIDefault
1117 + ),
1118 + AIModel(
1119 + id: "Qwen/Qwen3-Next-80B-A3B-Instruct", provider: .together, displayName: "Qwen3 Next 80B Instruct",
1120 + contextWindow: 262_144, maxOutputTokens: nil,
1121 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1122 + pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 1.50),
1123 + parameterSupport: .openAIDefault
1124 + ),
1125 + AIModel(
1126 + id: "Qwen/Qwen3-Next-80B-A3B-Thinking", provider: .together, displayName: "Qwen3 Next 80B Thinking",
1127 + contextWindow: 262_144, maxOutputTokens: nil,
1128 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1129 + pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 1.50),
1130 + parameterSupport: .openAIDefault
1131 + ),
1132 + AIModel(
1133 + id: "Qwen/Qwen3-Coder-Next-FP8", provider: .together, displayName: "Qwen3 Coder Next",
1134 + contextWindow: 262_144, maxOutputTokens: nil,
1135 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1136 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 1.20),
1137 + parameterSupport: .openAIDefault
1138 + ),
1139 + AIModel(
1140 + id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", provider: .together, displayName: "Qwen3 Coder 480B",
1141 + contextWindow: 262_144, maxOutputTokens: nil,
1142 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1143 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 2.00),
1144 + parameterSupport: .openAIDefault
1145 + ),
1146 + AIModel(
1147 + id: "Qwen/Qwen3-VL-32B-Instruct", provider: .together, displayName: "Qwen3 VL 32B",
1148 + contextWindow: 262_144, maxOutputTokens: nil,
1149 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1150 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 1.50),
1151 + parameterSupport: .openAIDefault
1152 + ),
1153 + AIModel(
1154 + id: "Qwen/Qwen3-VL-8B-Instruct", provider: .together, displayName: "Qwen3 VL 8B",
1155 + contextWindow: 262_144, maxOutputTokens: nil,
1156 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1157 + pricing: ModelPricing(inputPerMTok: 0.18, outputPerMTok: 0.68),
1158 + parameterSupport: .openAIDefault
1159 + ),
1160 + AIModel(
1161 + id: "Qwen/QwQ-32B", provider: .together, displayName: "QwQ 32B",
1162 + contextWindow: 131_072, maxOutputTokens: nil,
1163 + capabilities: ModelCapabilities(reasoning: true),
1164 + pricing: ModelPricing(inputPerMTok: 1.20, outputPerMTok: 1.20),
1165 + parameterSupport: .openAIDefault
1166 + ),
1167 + AIModel(
1168 + id: "meta-llama/Llama-4-Scout-17B-16E-Instruct", provider: .together, displayName: "Llama 4 Scout",
1169 + contextWindow: 1_048_576, maxOutputTokens: nil,
1170 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1171 + pricing: ModelPricing(inputPerMTok: 0.18, outputPerMTok: 0.59),
1172 + parameterSupport: .openAIDefault
1173 + ),
1174 + AIModel(
1175 + id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", provider: .together, displayName: "Llama 3.3 70B Turbo",
1176 + contextWindow: 131_072, maxOutputTokens: nil,
1177 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1178 + pricing: ModelPricing(inputPerMTok: 1.04, outputPerMTok: 1.04),
1179 + parameterSupport: .openAIDefault
1180 + ),
1181 + AIModel(
1182 + id: "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", provider: .together, displayName: "Llama 3.1 8B Turbo",
1183 + contextWindow: 131_072, maxOutputTokens: nil,
1184 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1185 + pricing: ModelPricing(inputPerMTok: 0.18, outputPerMTok: 0.18),
1186 + parameterSupport: .openAIDefault
1187 + ),
1188 + AIModel(
1189 + id: "openai/gpt-oss-120b", provider: .together, displayName: "GPT-OSS 120B",
1190 + contextWindow: 131_072, maxOutputTokens: nil,
1191 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1192 + pricing: ModelPricing(inputPerMTok: 0.15, outputPerMTok: 0.60),
1193 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, reasoningEffort: true),
1194 + isRecommended: true
1195 + ),
1196 + AIModel(
1197 + id: "openai/gpt-oss-20b", provider: .together, displayName: "GPT-OSS 20B",
1198 + contextWindow: 131_072, maxOutputTokens: nil,
1199 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1200 + pricing: ModelPricing(inputPerMTok: 0.05, outputPerMTok: 0.20),
1201 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, reasoningEffort: true)
1202 + ),
1203 + AIModel(
1204 + id: "nvidia/nemotron-3-ultra-550b-a55b", provider: .together, displayName: "Nemotron 3 Ultra 550B",
1205 + contextWindow: 512_288, maxOutputTokens: nil,
1206 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1207 + pricing: ModelPricing(inputPerMTok: 0.60, outputPerMTok: 3.60),
1208 + parameterSupport: .openAIDefault
1209 + ),
1210 + AIModel(
1211 + id: "MiniMaxAI/MiniMax-M3", provider: .together, displayName: "MiniMax M3",
1212 + contextWindow: 524_288, maxOutputTokens: nil,
1213 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1214 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 1.20),
1215 + parameterSupport: .openAIDefault
1216 + ),
1217 + AIModel(
1218 + id: "mistralai/Ministral-3-14B-Instruct-2512", provider: .together, displayName: "Ministral 3 14B",
1219 + contextWindow: 262_144, maxOutputTokens: nil,
1220 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1221 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 0.20),
1222 + parameterSupport: .openAIDefault
1223 + ),
1224 + AIModel(
1225 + id: "google/gemma-4-31B-it", provider: .together, displayName: "Gemma 4 31B",
1226 + contextWindow: 262_144, maxOutputTokens: nil,
1227 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1228 + pricing: ModelPricing(inputPerMTok: 0.39, outputPerMTok: 0.97),
1229 + parameterSupport: .openAIDefault
1230 + ),
1231 + AIModel(
1232 + id: "thinkingmachines/Inkling", provider: .together, displayName: "Inkling",
1233 + contextWindow: 524_288, maxOutputTokens: nil,
1234 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1235 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 4.05),
1236 + parameterSupport: .openAIDefault
1237 + ),
1238 + AIModel(
1239 + id: "mistralai/Mixtral-8x7B-Instruct-v0.1", provider: .together, displayName: "Mixtral 8x7B",
1240 + contextWindow: 32_768, maxOutputTokens: nil,
1241 + capabilities: ModelCapabilities(jsonMode: true),
1242 + pricing: ModelPricing(inputPerMTok: 0.60, outputPerMTok: 0.60),
1243 + parameterSupport: .openAIDefault,
1244 + isLegacy: true
1245 + ),
1246 + ]
1247 +
1248 + // MARK: - DeepInfra
1249 +
1250 + static let deepinfra: [AIModel] = [
1251 + // Proxied frontier models (Claude / Gemini under DeepInfra billing)
1252 + AIModel(
1253 + id: "anthropic/claude-fable-5", provider: .deepinfra, displayName: "Claude Fable 5",
1254 + contextWindow: 1_000_000, maxOutputTokens: nil,
1255 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1256 + pricing: ModelPricing(inputPerMTok: 10.00, outputPerMTok: 50.00),
1257 + parameterSupport: ParameterSupport()
1258 + ),
1259 + AIModel(
1260 + id: "anthropic/claude-opus-5", provider: .deepinfra, displayName: "Claude Opus 5",
1261 + contextWindow: 1_000_000, maxOutputTokens: nil,
1262 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1263 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
1264 + parameterSupport: ParameterSupport()
1265 + ),
1266 + AIModel(
1267 + id: "anthropic/claude-sonnet-5", provider: .deepinfra, displayName: "Claude Sonnet 5",
1268 + contextWindow: 1_000_000, maxOutputTokens: nil,
1269 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1270 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 10.00),
1271 + parameterSupport: ParameterSupport()
1272 + ),
1273 + AIModel(
1274 + id: "anthropic/claude-opus-4-8", provider: .deepinfra, displayName: "Claude Opus 4.8",
1275 + contextWindow: 1_000_000, maxOutputTokens: nil,
1276 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1277 + pricing: ModelPricing(inputPerMTok: 5.00, outputPerMTok: 25.00),
1278 + parameterSupport: ParameterSupport()
1279 + ),
1280 + AIModel(
1281 + id: "anthropic/claude-haiku-4-5", provider: .deepinfra, displayName: "Claude Haiku 4.5",
1282 + contextWindow: 200_000, maxOutputTokens: nil,
1283 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1284 + pricing: ModelPricing(inputPerMTok: 1.00, outputPerMTok: 5.00),
1285 + parameterSupport: ParameterSupport()
1286 + ),
1287 + AIModel(
1288 + id: "google/gemini-3.1-pro", provider: .deepinfra, displayName: "Gemini 3.1 Pro",
1289 + contextWindow: 1_000_000, maxOutputTokens: nil,
1290 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1291 + pricing: ModelPricing(inputPerMTok: 2.00, outputPerMTok: 12.00),
1292 + parameterSupport: ParameterSupport()
1293 + ),
1294 + AIModel(
1295 + id: "google/gemini-3.5-flash", provider: .deepinfra, displayName: "Gemini 3.5 Flash",
1296 + contextWindow: 1_000_000, maxOutputTokens: nil,
1297 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1298 + pricing: ModelPricing(inputPerMTok: 1.50, outputPerMTok: 9.00),
1299 + parameterSupport: ParameterSupport()
1300 + ),
1301 + AIModel(
1302 + id: "google/gemini-3.1-flash-lite", provider: .deepinfra, displayName: "Gemini 3.1 Flash-Lite",
1303 + contextWindow: 1_000_000, maxOutputTokens: nil,
1304 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1305 + pricing: ModelPricing(inputPerMTok: 0.25, outputPerMTok: 1.50),
1306 + parameterSupport: ParameterSupport()
1307 + ),
1308 + AIModel(
1309 + id: "google/gemini-2.5-pro", provider: .deepinfra, displayName: "Gemini 2.5 Pro",
1310 + contextWindow: 1_000_000, maxOutputTokens: nil,
1311 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1312 + pricing: ModelPricing(inputPerMTok: 1.25, outputPerMTok: 10.00),
1313 + parameterSupport: ParameterSupport()
1314 + ),
1315 + AIModel(
1316 + id: "google/gemini-2.5-flash", provider: .deepinfra, displayName: "Gemini 2.5 Flash",
1317 + contextWindow: 1_000_000, maxOutputTokens: nil,
1318 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1319 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 2.50),
1320 + parameterSupport: ParameterSupport()
1321 + ),
1322 + // Open-weight chat models
1323 + AIModel(
1324 + id: "deepseek-ai/DeepSeek-V4-Pro", provider: .deepinfra, displayName: "DeepSeek V4 Pro",
1325 + contextWindow: 1_048_576, maxOutputTokens: nil,
1326 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1327 + pricing: ModelPricing(inputPerMTok: 1.30, outputPerMTok: 2.60),
1328 + parameterSupport: .openAIDefault,
1329 + isRecommended: true
1330 + ),
1331 + AIModel(
1332 + id: "deepseek-ai/DeepSeek-V4-Flash", provider: .deepinfra, displayName: "DeepSeek V4 Flash",
1333 + contextWindow: 1_048_576, maxOutputTokens: nil,
1334 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1335 + pricing: ModelPricing(inputPerMTok: 0.09, outputPerMTok: 0.18),
1336 + parameterSupport: .openAIDefault,
1337 + isRecommended: true
1338 + ),
1339 + AIModel(
1340 + id: "deepseek-ai/DeepSeek-V3.1", provider: .deepinfra, displayName: "DeepSeek V3.1",
1341 + contextWindow: 163_840, maxOutputTokens: nil,
1342 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1343 + pricing: ModelPricing(inputPerMTok: 0.25, outputPerMTok: 0.95),
1344 + parameterSupport: .openAIDefault
1345 + ),
1346 + AIModel(
1347 + id: "deepseek-ai/DeepSeek-R1-0528", provider: .deepinfra, displayName: "DeepSeek R1 0528",
1348 + contextWindow: 163_840, maxOutputTokens: nil,
1349 + capabilities: ModelCapabilities(reasoning: true),
1350 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 2.15),
1351 + parameterSupport: .openAIDefault
1352 + ),
1353 + AIModel(
1354 + id: "moonshotai/Kimi-K2.7-Code", provider: .deepinfra, displayName: "Kimi K2.7 Code",
1355 + contextWindow: 262_144, maxOutputTokens: nil,
1356 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1357 + pricing: ModelPricing(inputPerMTok: 0.74, outputPerMTok: 3.50),
1358 + parameterSupport: .openAIDefault
1359 + ),
1360 + AIModel(
1361 + id: "moonshotai/Kimi-K2.6", provider: .deepinfra, displayName: "Kimi K2.6",
1362 + contextWindow: 262_144, maxOutputTokens: nil,
1363 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1364 + pricing: ModelPricing(inputPerMTok: 0.75, outputPerMTok: 3.50),
1365 + parameterSupport: .openAIDefault
1366 + ),
1367 + AIModel(
1368 + id: "moonshotai/Kimi-K2.5", provider: .deepinfra, displayName: "Kimi K2.5",
1369 + contextWindow: 262_144, maxOutputTokens: nil,
1370 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1371 + pricing: ModelPricing(inputPerMTok: 0.45, outputPerMTok: 2.25),
1372 + parameterSupport: .openAIDefault
1373 + ),
1374 + AIModel(
1375 + id: "zai-org/GLM-5.2", provider: .deepinfra, displayName: "GLM 5.2",
1376 + contextWindow: 1_048_576, maxOutputTokens: nil,
1377 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1378 + pricing: ModelPricing(inputPerMTok: 0.75, outputPerMTok: 2.40),
1379 + parameterSupport: .openAIDefault,
1380 + isRecommended: true
1381 + ),
1382 + AIModel(
1383 + id: "zai-org/GLM-4.7", provider: .deepinfra, displayName: "GLM 4.7",
1384 + contextWindow: 202_752, maxOutputTokens: nil,
1385 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1386 + pricing: ModelPricing(inputPerMTok: 0.40, outputPerMTok: 1.75),
1387 + parameterSupport: .openAIDefault
1388 + ),
1389 + AIModel(
1390 + id: "Qwen/Qwen3.7-Max", provider: .deepinfra, displayName: "Qwen3.7 Max",
1391 + contextWindow: 256_000, maxOutputTokens: nil,
1392 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1393 + pricing: ModelPricing(inputPerMTok: 2.50, outputPerMTok: 7.50),
1394 + parameterSupport: .openAIDefault
1395 + ),
1396 + AIModel(
1397 + id: "Qwen/Qwen3.5-397B-A17B", provider: .deepinfra, displayName: "Qwen3.5 397B A17B",
1398 + contextWindow: 262_144, maxOutputTokens: nil,
1399 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1400 + pricing: ModelPricing(inputPerMTok: 0.45, outputPerMTok: 3.00),
1401 + parameterSupport: .openAIDefault
1402 + ),
1403 + AIModel(
1404 + id: "Qwen/Qwen3-235B-A22B-Instruct-2507", provider: .deepinfra, displayName: "Qwen3 235B Instruct 2507",
1405 + contextWindow: 262_144, maxOutputTokens: nil,
1406 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1407 + pricing: ModelPricing(inputPerMTok: 0.09, outputPerMTok: 0.55),
1408 + parameterSupport: .openAIDefault
1409 + ),
1410 + AIModel(
1411 + id: "Qwen/Qwen3-235B-A22B-Thinking-2507", provider: .deepinfra, displayName: "Qwen3 235B Thinking 2507",
1412 + contextWindow: 262_144, maxOutputTokens: nil,
1413 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1414 + pricing: ModelPricing(inputPerMTok: 0.23, outputPerMTok: 2.30),
1415 + parameterSupport: .openAIDefault
1416 + ),
1417 + AIModel(
1418 + id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", provider: .deepinfra, displayName: "Qwen3 Coder 480B Turbo",
1419 + contextWindow: 262_144, maxOutputTokens: nil,
1420 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1421 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 1.00),
1422 + parameterSupport: .openAIDefault
1423 + ),
1424 + AIModel(
1425 + id: "Qwen/Qwen3-VL-235B-A22B-Instruct", provider: .deepinfra, displayName: "Qwen3 VL 235B",
1426 + contextWindow: 262_144, maxOutputTokens: nil,
1427 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1428 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 0.88),
1429 + parameterSupport: .openAIDefault
1430 + ),
1431 + AIModel(
1432 + id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", provider: .deepinfra, displayName: "Llama 4 Maverick",
1433 + contextWindow: 1_048_576, maxOutputTokens: nil,
1434 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1435 + pricing: ModelPricing(inputPerMTok: 0.20, outputPerMTok: 0.80),
1436 + parameterSupport: .openAIDefault
1437 + ),
1438 + AIModel(
1439 + id: "meta-llama/Llama-4-Scout-17B-16E-Instruct", provider: .deepinfra, displayName: "Llama 4 Scout",
1440 + contextWindow: 327_680, maxOutputTokens: nil,
1441 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1442 + pricing: ModelPricing(inputPerMTok: 0.10, outputPerMTok: 0.30),
1443 + parameterSupport: .openAIDefault
1444 + ),
1445 + AIModel(
1446 + id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", provider: .deepinfra, displayName: "Llama 3.3 70B Turbo",
1447 + contextWindow: 131_072, maxOutputTokens: nil,
1448 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1449 + pricing: ModelPricing(inputPerMTok: 0.10, outputPerMTok: 0.32),
1450 + parameterSupport: .openAIDefault
1451 + ),
1452 + AIModel(
1453 + id: "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", provider: .deepinfra, displayName: "Llama 3.1 8B Turbo",
1454 + contextWindow: 131_072, maxOutputTokens: nil,
1455 + capabilities: ModelCapabilities(tools: true, jsonMode: true),
1456 + pricing: ModelPricing(inputPerMTok: 0.02, outputPerMTok: 0.04),
1457 + parameterSupport: .openAIDefault
1458 + ),
1459 + AIModel(
1460 + id: "openai/gpt-oss-120b", provider: .deepinfra, displayName: "GPT-OSS 120B",
1461 + contextWindow: 131_072, maxOutputTokens: nil,
1462 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1463 + pricing: ModelPricing(inputPerMTok: 0.037, outputPerMTok: 0.17),
1464 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, reasoningEffort: true),
1465 + isRecommended: true
1466 + ),
1467 + AIModel(
1468 + id: "openai/gpt-oss-20b", provider: .deepinfra, displayName: "GPT-OSS 20B",
1469 + contextWindow: 131_072, maxOutputTokens: nil,
1470 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1471 + pricing: ModelPricing(inputPerMTok: 0.03, outputPerMTok: 0.14),
1472 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, reasoningEffort: true)
1473 + ),
1474 + AIModel(
1475 + id: "MiniMaxAI/MiniMax-M3", provider: .deepinfra, displayName: "MiniMax M3",
1476 + contextWindow: 524_288, maxOutputTokens: nil,
1477 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1478 + pricing: ModelPricing(inputPerMTok: 0.30, outputPerMTok: 1.20),
1479 + parameterSupport: .openAIDefault
1480 + ),
1481 + AIModel(
1482 + id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", provider: .deepinfra, displayName: "Nemotron 3 Ultra 550B",
1483 + contextWindow: 262_144, maxOutputTokens: nil,
1484 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1485 + pricing: ModelPricing(inputPerMTok: 0.50, outputPerMTok: 2.20),
1486 + parameterSupport: .openAIDefault
1487 + ),
1488 + AIModel(
1489 + id: "mistralai/Mistral-Small-3.2-24B-Instruct-2506", provider: .deepinfra, displayName: "Mistral Small 3.2 24B",
1490 + contextWindow: 128_000, maxOutputTokens: nil,
1491 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1492 + pricing: ModelPricing(inputPerMTok: 0.075, outputPerMTok: 0.20),
1493 + parameterSupport: .openAIDefault
1494 + ),
1495 + AIModel(
1496 + id: "google/gemma-4-31B-it", provider: .deepinfra, displayName: "Gemma 4 31B",
1497 + contextWindow: 262_144, maxOutputTokens: nil,
1498 + capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1499 + pricing: ModelPricing(inputPerMTok: 0.13, outputPerMTok: 0.38),
1500 + parameterSupport: .openAIDefault
1501 + ),
1502 + ]
1503 +
1504 + // MARK: - Cerebras
1505 +
1506 + static let cerebras: [AIModel] = [
1507 + AIModel(
1508 + id: "gpt-oss-120b", provider: .cerebras, displayName: "GPT-OSS 120B",
1509 + contextWindow: 131_072, maxOutputTokens: 40_000,
1510 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1511 + pricing: ModelPricing(inputPerMTok: 0.35, outputPerMTok: 0.75),
1512 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, usesMaxCompletionTokens: true, reasoningEffort: true),
1513 + isRecommended: true
1514 + ),
1515 + AIModel(
1516 + id: "gemma-4-31b", provider: .cerebras, displayName: "Gemma 4 31B",
1517 + contextWindow: 131_072, maxOutputTokens: 40_000,
1518 + capabilities: ModelCapabilities(vision: true, tools: true, reasoning: true, jsonMode: true),
1519 + pricing: ModelPricing(inputPerMTok: 0.99, outputPerMTok: 1.49),
1520 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, usesMaxCompletionTokens: true, reasoningEffort: true)
1521 + ),
1522 + AIModel(
1523 + id: "zai-glm-4.7", provider: .cerebras, displayName: "GLM 4.7",
1524 + contextWindow: 131_072, maxOutputTokens: 40_000,
1525 + capabilities: ModelCapabilities(tools: true, reasoning: true, jsonMode: true),
1526 + pricing: ModelPricing(inputPerMTok: 2.25, outputPerMTok: 2.75),
1527 + parameterSupport: ParameterSupport(frequencyPenalty: true, presencePenalty: true, usesMaxCompletionTokens: true, reasoningEffort: true),
1528 + // Scheduled for discontinuation on 2026-08-17.
1529 + isLegacy: true
1530 + ),
1531 + ]
1532 +
1533 + // MARK: - All providers
1534 +
1535 + static let all: [AIModel] =
1536 + openai + anthropic + xai + mistral + gemini + qwen +
1537 + deepseek + kimi + perplexity + together + deepinfra + cerebras
41 1538 }
added assets/icon/zyquo-cloud-small.svg +32 −0
@@ -0,0 +1,32 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + zyquo-cloud-small.svg
4 + Zyquo Cloud
5 +
6 + Author: Simon-Pierre Boucher
7 + Mail: contact@spboucher.ai
8 +
9 + Simplified small-size variant of the app icon, used for the 16px and 32px
10 + icns slots: larger cloud, thicker Z, no distant cloud layer, flat fills.
11 +-->
12 +<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
13 + <defs>
14 + <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
15 + <stop offset="0" stop-color="#7FB0FF"/>
16 + <stop offset="1" stop-color="#3F49B8"/>
17 + </linearGradient>
18 + <clipPath id="sq"><path d="M 924.00 512.00 L 923.99 564.43 L 923.97 582.87 L 923.94 596.53 L 923.89 607.79 L 923.83 617.55 L 923.75 626.25 L 923.67 634.16 L 923.56 641.45 L 923.45 648.24 L 923.32 654.61 L 923.17 660.63 L 923.02 666.34 L 922.85 671.78 L 922.66 676.99 L 922.46 681.99 L 922.25 686.80 L 922.03 691.43 L 921.79 695.91 L 921.53 700.25 L 921.27 704.45 L 920.99 708.53 L 920.69 712.50 L 920.38 716.36 L 920.06 720.12 L 919.73 723.79 L 919.38 727.38 L 919.01 730.87 L 918.63 734.30 L 918.24 737.64 L 917.84 740.92 L 917.42 744.13 L 916.98 747.27 L 916.54 750.35 L 916.07 753.38 L 915.60 756.34 L 915.11 759.26 L 914.60 762.12 L 914.09 764.93 L 913.55 767.69 L 913.01 770.41 L 912.45 773.08 L 911.87 775.71 L 911.28 778.30 L 910.68 780.84 L 910.06 783.35 L 909.43 785.81 L 908.78 788.24 L 908.12 790.63 L 907.44 792.99 L 906.75 795.31 L 906.04 797.60 L 905.32 799.86 L 904.59 802.08 L 903.84 804.27 L 903.07 806.43 L 902.29 808.56 L 901.50 810.67 L 900.69 812.74 L 899.86 814.78 L 899.02 816.80 L 898.17 818.79 L 897.30 820.75 L 896.41 822.69 L 895.51 824.60 L 894.59 826.49 L 893.66 828.35 L 892.71 830.18 L 891.75 831.99 L 890.77 833.78 L 889.77 835.55 L 888.76 837.29 L 887.73 839.01 L 886.69 840.70 L 885.63 842.38 L 884.55 844.03 L 883.46 845.66 L 882.35 847.27 L 881.22 848.86 L 880.08 850.43 L 878.92 851.98 L 877.74 853.50 L 876.55 855.01 L 875.34 856.50 L 874.11 857.97 L 872.87 859.41 L 871.60 860.84 L 870.32 862.25 L 869.02 863.64 L 867.70 865.02 L 866.37 866.37 L 865.02 867.70 L 863.64 869.02 L 862.25 870.32 L 860.84 871.60 L 859.41 872.87 L 857.97 874.11 L 856.50 875.34 L 855.01 876.55 L 853.50 877.74 L 851.98 878.92 L 850.43 880.08 L 848.86 881.22 L 847.27 882.35 L 845.66 883.46 L 844.03 884.55 L 842.38 885.63 L 840.70 886.69 L 839.01 887.73 L 837.29 888.76 L 835.55 889.77 L 833.78 890.77 L 831.99 891.75 L 830.18 892.71 L 828.35 893.66 L 826.49 894.59 L 824.60 895.51 L 822.69 896.41 L 820.75 897.30 L 818.79 898.17 L 816.80 899.02 L 814.78 899.86 L 812.74 900.69 L 810.67 901.50 L 808.56 902.29 L 806.43 903.07 L 804.27 903.84 L 802.08 904.59 L 799.86 905.32 L 797.60 906.04 L 795.31 906.75 L 792.99 907.44 L 790.63 908.12 L 788.24 908.78 L 785.81 909.43 L 783.35 910.06 L 780.84 910.68 L 778.30 911.28 L 775.71 911.87 L 773.08 912.45 L 770.41 913.01 L 767.69 913.55 L 764.93 914.09 L 762.12 914.60 L 759.26 915.11 L 756.34 915.60 L 753.38 916.07 L 750.35 916.54 L 747.27 916.98 L 744.13 917.42 L 740.92 917.84 L 737.64 918.24 L 734.30 918.63 L 730.87 919.01 L 727.38 919.38 L 723.79 919.73 L 720.12 920.06 L 716.36 920.38 L 712.50 920.69 L 708.53 920.99 L 704.45 921.27 L 700.25 921.53 L 695.91 921.79 L 691.43 922.03 L 686.80 922.25 L 681.99 922.46 L 676.99 922.66 L 671.78 922.85 L 666.34 923.02 L 660.63 923.17 L 654.61 923.32 L 648.24 923.45 L 641.45 923.56 L 634.16 923.67 L 626.25 923.75 L 617.55 923.83 L 607.79 923.89 L 596.53 923.94 L 582.87 923.97 L 564.43 923.99 L 512.00 924.00 L 459.57 923.99 L 441.13 923.97 L 427.47 923.94 L 416.21 923.89 L 406.45 923.83 L 397.75 923.75 L 389.84 923.67 L 382.55 923.56 L 375.76 923.45 L 369.39 923.32 L 363.37 923.17 L 357.66 923.02 L 352.22 922.85 L 347.01 922.66 L 342.01 922.46 L 337.20 922.25 L 332.57 922.03 L 328.09 921.79 L 323.75 921.53 L 319.55 921.27 L 315.47 920.99 L 311.50 920.69 L 307.64 920.38 L 303.88 920.06 L 300.21 919.73 L 296.62 919.38 L 293.13 919.01 L 289.70 918.63 L 286.36 918.24 L 283.08 917.84 L 279.87 917.42 L 276.73 916.98 L 273.65 916.54 L 270.62 916.07 L 267.66 915.60 L 264.74 915.11 L 261.88 914.60 L 259.07 914.09 L 256.31 913.55 L 253.59 913.01 L 250.92 912.45 L 248.29 911.87 L 245.70 911.28 L 243.16 910.68 L 240.65 910.06 L 238.19 909.43 L 235.76 908.78 L 233.37 908.12 L 231.01 907.44 L 228.69 906.75 L 226.40 906.04 L 224.14 905.32 L 221.92 904.59 L 219.73 903.84 L 217.57 903.07 L 215.44 902.29 L 213.33 901.50 L 211.26 900.69 L 209.22 899.86 L 207.20 899.02 L 205.21 898.17 L 203.25 897.30 L 201.31 896.41 L 199.40 895.51 L 197.51 894.59 L 195.65 893.66 L 193.82 892.71 L 192.01 891.75 L 190.22 890.77 L 188.45 889.77 L 186.71 888.76 L 184.99 887.73 L 183.30 886.69 L 181.62 885.63 L 179.97 884.55 L 178.34 883.46 L 176.73 882.35 L 175.14 881.22 L 173.57 880.08 L 172.02 878.92 L 170.50 877.74 L 168.99 876.55 L 167.50 875.34 L 166.03 874.11 L 164.59 872.87 L 163.16 871.60 L 161.75 870.32 L 160.36 869.02 L 158.98 867.70 L 157.63 866.37 L 156.30 865.02 L 154.98 863.64 L 153.68 862.25 L 152.40 860.84 L 151.13 859.41 L 149.89 857.97 L 148.66 856.50 L 147.45 855.01 L 146.26 853.50 L 145.08 851.98 L 143.92 850.43 L 142.78 848.86 L 141.65 847.27 L 140.54 845.66 L 139.45 844.03 L 138.37 842.38 L 137.31 840.70 L 136.27 839.01 L 135.24 837.29 L 134.23 835.55 L 133.23 833.78 L 132.25 831.99 L 131.29 830.18 L 130.34 828.35 L 129.41 826.49 L 128.49 824.60 L 127.59 822.69 L 126.70 820.75 L 125.83 818.79 L 124.98 816.80 L 124.14 814.78 L 123.31 812.74 L 122.50 810.67 L 121.71 808.56 L 120.93 806.43 L 120.16 804.27 L 119.41 802.08 L 118.68 799.86 L 117.96 797.60 L 117.25 795.31 L 116.56 792.99 L 115.88 790.63 L 115.22 788.24 L 114.57 785.81 L 113.94 783.35 L 113.32 780.84 L 112.72 778.30 L 112.13 775.71 L 111.55 773.08 L 110.99 770.41 L 110.45 767.69 L 109.91 764.93 L 109.40 762.12 L 108.89 759.26 L 108.40 756.34 L 107.93 753.38 L 107.46 750.35 L 107.02 747.27 L 106.58 744.13 L 106.16 740.92 L 105.76 737.64 L 105.37 734.30 L 104.99 730.87 L 104.62 727.38 L 104.27 723.79 L 103.94 720.12 L 103.62 716.36 L 103.31 712.50 L 103.01 708.53 L 102.73 704.45 L 102.47 700.25 L 102.21 695.91 L 101.97 691.43 L 101.75 686.80 L 101.54 681.99 L 101.34 676.99 L 101.15 671.78 L 100.98 666.34 L 100.83 660.63 L 100.68 654.61 L 100.55 648.24 L 100.44 641.45 L 100.33 634.16 L 100.25 626.25 L 100.17 617.55 L 100.11 607.79 L 100.06 596.53 L 100.03 582.87 L 100.01 564.43 L 100.00 512.00 L 100.01 459.57 L 100.03 441.13 L 100.06 427.47 L 100.11 416.21 L 100.17 406.45 L 100.25 397.75 L 100.33 389.84 L 100.44 382.55 L 100.55 375.76 L 100.68 369.39 L 100.83 363.37 L 100.98 357.66 L 101.15 352.22 L 101.34 347.01 L 101.54 342.01 L 101.75 337.20 L 101.97 332.57 L 102.21 328.09 L 102.47 323.75 L 102.73 319.55 L 103.01 315.47 L 103.31 311.50 L 103.62 307.64 L 103.94 303.88 L 104.27 300.21 L 104.62 296.62 L 104.99 293.13 L 105.37 289.70 L 105.76 286.36 L 106.16 283.08 L 106.58 279.87 L 107.02 276.73 L 107.46 273.65 L 107.93 270.62 L 108.40 267.66 L 108.89 264.74 L 109.40 261.88 L 109.91 259.07 L 110.45 256.31 L 110.99 253.59 L 111.55 250.92 L 112.13 248.29 L 112.72 245.70 L 113.32 243.16 L 113.94 240.65 L 114.57 238.19 L 115.22 235.76 L 115.88 233.37 L 116.56 231.01 L 117.25 228.69 L 117.96 226.40 L 118.68 224.14 L 119.41 221.92 L 120.16 219.73 L 120.93 217.57 L 121.71 215.44 L 122.50 213.33 L 123.31 211.26 L 124.14 209.22 L 124.98 207.20 L 125.83 205.21 L 126.70 203.25 L 127.59 201.31 L 128.49 199.40 L 129.41 197.51 L 130.34 195.65 L 131.29 193.82 L 132.25 192.01 L 133.23 190.22 L 134.23 188.45 L 135.24 186.71 L 136.27 184.99 L 137.31 183.30 L 138.37 181.62 L 139.45 179.97 L 140.54 178.34 L 141.65 176.73 L 142.78 175.14 L 143.92 173.57 L 145.08 172.02 L 146.26 170.50 L 147.45 168.99 L 148.66 167.50 L 149.89 166.03 L 151.13 164.59 L 152.40 163.16 L 153.68 161.75 L 154.98 160.36 L 156.30 158.98 L 157.63 157.63 L 158.98 156.30 L 160.36 154.98 L 161.75 153.68 L 163.16 152.40 L 164.59 151.13 L 166.03 149.89 L 167.50 148.66 L 168.99 147.45 L 170.50 146.26 L 172.02 145.08 L 173.57 143.92 L 175.14 142.78 L 176.73 141.65 L 178.34 140.54 L 179.97 139.45 L 181.62 138.37 L 183.30 137.31 L 184.99 136.27 L 186.71 135.24 L 188.45 134.23 L 190.22 133.23 L 192.01 132.25 L 193.82 131.29 L 195.65 130.34 L 197.51 129.41 L 199.40 128.49 L 201.31 127.59 L 203.25 126.70 L 205.21 125.83 L 207.20 124.98 L 209.22 124.14 L 211.26 123.31 L 213.33 122.50 L 215.44 121.71 L 217.57 120.93 L 219.73 120.16 L 221.92 119.41 L 224.14 118.68 L 226.40 117.96 L 228.69 117.25 L 231.01 116.56 L 233.37 115.88 L 235.76 115.22 L 238.19 114.57 L 240.65 113.94 L 243.16 113.32 L 245.70 112.72 L 248.29 112.13 L 250.92 111.55 L 253.59 110.99 L 256.31 110.45 L 259.07 109.91 L 261.88 109.40 L 264.74 108.89 L 267.66 108.40 L 270.62 107.93 L 273.65 107.46 L 276.73 107.02 L 279.87 106.58 L 283.08 106.16 L 286.36 105.76 L 289.70 105.37 L 293.13 104.99 L 296.62 104.62 L 300.21 104.27 L 303.88 103.94 L 307.64 103.62 L 311.50 103.31 L 315.47 103.01 L 319.55 102.73 L 323.75 102.47 L 328.09 102.21 L 332.57 101.97 L 337.20 101.75 L 342.01 101.54 L 347.01 101.34 L 352.22 101.15 L 357.66 100.98 L 363.37 100.83 L 369.39 100.68 L 375.76 100.55 L 382.55 100.44 L 389.84 100.33 L 397.75 100.25 L 406.45 100.17 L 416.21 100.11 L 427.47 100.06 L 441.13 100.03 L 459.57 100.01 L 512.00 100.00 L 564.43 100.01 L 582.87 100.03 L 596.53 100.06 L 607.79 100.11 L 617.55 100.17 L 626.25 100.25 L 634.16 100.33 L 641.45 100.44 L 648.24 100.55 L 654.61 100.68 L 660.63 100.83 L 666.34 100.98 L 671.78 101.15 L 676.99 101.34 L 681.99 101.54 L 686.80 101.75 L 691.43 101.97 L 695.91 102.21 L 700.25 102.47 L 704.45 102.73 L 708.53 103.01 L 712.50 103.31 L 716.36 103.62 L 720.12 103.94 L 723.79 104.27 L 727.38 104.62 L 730.87 104.99 L 734.30 105.37 L 737.64 105.76 L 740.92 106.16 L 744.13 106.58 L 747.27 107.02 L 750.35 107.46 L 753.38 107.93 L 756.34 108.40 L 759.26 108.89 L 762.12 109.40 L 764.93 109.91 L 767.69 110.45 L 770.41 110.99 L 773.08 111.55 L 775.71 112.13 L 778.30 112.72 L 780.84 113.32 L 783.35 113.94 L 785.81 114.57 L 788.24 115.22 L 790.63 115.88 L 792.99 116.56 L 795.31 117.25 L 797.60 117.96 L 799.86 118.68 L 802.08 119.41 L 804.27 120.16 L 806.43 120.93 L 808.56 121.71 L 810.67 122.50 L 812.74 123.31 L 814.78 124.14 L 816.80 124.98 L 818.79 125.83 L 820.75 126.70 L 822.69 127.59 L 824.60 128.49 L 826.49 129.41 L 828.35 130.34 L 830.18 131.29 L 831.99 132.25 L 833.78 133.23 L 835.55 134.23 L 837.29 135.24 L 839.01 136.27 L 840.70 137.31 L 842.38 138.37 L 844.03 139.45 L 845.66 140.54 L 847.27 141.65 L 848.86 142.78 L 850.43 143.92 L 851.98 145.08 L 853.50 146.26 L 855.01 147.45 L 856.50 148.66 L 857.97 149.89 L 859.41 151.13 L 860.84 152.40 L 862.25 153.68 L 863.64 154.98 L 865.02 156.30 L 866.37 157.63 L 867.70 158.98 L 869.02 160.36 L 870.32 161.75 L 871.60 163.16 L 872.87 164.59 L 874.11 166.03 L 875.34 167.50 L 876.55 168.99 L 877.74 170.50 L 878.92 172.02 L 880.08 173.57 L 881.22 175.14 L 882.35 176.73 L 883.46 178.34 L 884.55 179.97 L 885.63 181.62 L 886.69 183.30 L 887.73 184.99 L 888.76 186.71 L 889.77 188.45 L 890.77 190.22 L 891.75 192.01 L 892.71 193.82 L 893.66 195.65 L 894.59 197.51 L 895.51 199.40 L 896.41 201.31 L 897.30 203.25 L 898.17 205.21 L 899.02 207.20 L 899.86 209.22 L 900.69 211.26 L 901.50 213.33 L 902.29 215.44 L 903.07 217.57 L 903.84 219.73 L 904.59 221.92 L 905.32 224.14 L 906.04 226.40 L 906.75 228.69 L 907.44 231.01 L 908.12 233.37 L 908.78 235.76 L 909.43 238.19 L 910.06 240.65 L 910.68 243.16 L 911.28 245.70 L 911.87 248.29 L 912.45 250.92 L 913.01 253.59 L 913.55 256.31 L 914.09 259.07 L 914.60 261.88 L 915.11 264.74 L 915.60 267.66 L 916.07 270.62 L 916.54 273.65 L 916.98 276.73 L 917.42 279.87 L 917.84 283.08 L 918.24 286.36 L 918.63 289.70 L 919.01 293.13 L 919.38 296.62 L 919.73 300.21 L 920.06 303.88 L 920.38 307.64 L 920.69 311.50 L 920.99 315.47 L 921.27 319.55 L 921.53 323.75 L 921.79 328.09 L 922.03 332.57 L 922.25 337.20 L 922.46 342.01 L 922.66 347.01 L 922.85 352.22 L 923.02 357.66 L 923.17 363.37 L 923.32 369.39 L 923.45 375.76 L 923.56 382.55 L 923.67 389.84 L 923.75 397.75 L 923.83 406.45 L 923.89 416.21 L 923.94 427.47 L 923.97 441.13 L 923.99 459.57 Z"/></clipPath>
19 + </defs>
20 + <g clip-path="url(#sq)">
21 + <path d="M 924.00 512.00 L 923.99 564.43 L 923.97 582.87 L 923.94 596.53 L 923.89 607.79 L 923.83 617.55 L 923.75 626.25 L 923.67 634.16 L 923.56 641.45 L 923.45 648.24 L 923.32 654.61 L 923.17 660.63 L 923.02 666.34 L 922.85 671.78 L 922.66 676.99 L 922.46 681.99 L 922.25 686.80 L 922.03 691.43 L 921.79 695.91 L 921.53 700.25 L 921.27 704.45 L 920.99 708.53 L 920.69 712.50 L 920.38 716.36 L 920.06 720.12 L 919.73 723.79 L 919.38 727.38 L 919.01 730.87 L 918.63 734.30 L 918.24 737.64 L 917.84 740.92 L 917.42 744.13 L 916.98 747.27 L 916.54 750.35 L 916.07 753.38 L 915.60 756.34 L 915.11 759.26 L 914.60 762.12 L 914.09 764.93 L 913.55 767.69 L 913.01 770.41 L 912.45 773.08 L 911.87 775.71 L 911.28 778.30 L 910.68 780.84 L 910.06 783.35 L 909.43 785.81 L 908.78 788.24 L 908.12 790.63 L 907.44 792.99 L 906.75 795.31 L 906.04 797.60 L 905.32 799.86 L 904.59 802.08 L 903.84 804.27 L 903.07 806.43 L 902.29 808.56 L 901.50 810.67 L 900.69 812.74 L 899.86 814.78 L 899.02 816.80 L 898.17 818.79 L 897.30 820.75 L 896.41 822.69 L 895.51 824.60 L 894.59 826.49 L 893.66 828.35 L 892.71 830.18 L 891.75 831.99 L 890.77 833.78 L 889.77 835.55 L 888.76 837.29 L 887.73 839.01 L 886.69 840.70 L 885.63 842.38 L 884.55 844.03 L 883.46 845.66 L 882.35 847.27 L 881.22 848.86 L 880.08 850.43 L 878.92 851.98 L 877.74 853.50 L 876.55 855.01 L 875.34 856.50 L 874.11 857.97 L 872.87 859.41 L 871.60 860.84 L 870.32 862.25 L 869.02 863.64 L 867.70 865.02 L 866.37 866.37 L 865.02 867.70 L 863.64 869.02 L 862.25 870.32 L 860.84 871.60 L 859.41 872.87 L 857.97 874.11 L 856.50 875.34 L 855.01 876.55 L 853.50 877.74 L 851.98 878.92 L 850.43 880.08 L 848.86 881.22 L 847.27 882.35 L 845.66 883.46 L 844.03 884.55 L 842.38 885.63 L 840.70 886.69 L 839.01 887.73 L 837.29 888.76 L 835.55 889.77 L 833.78 890.77 L 831.99 891.75 L 830.18 892.71 L 828.35 893.66 L 826.49 894.59 L 824.60 895.51 L 822.69 896.41 L 820.75 897.30 L 818.79 898.17 L 816.80 899.02 L 814.78 899.86 L 812.74 900.69 L 810.67 901.50 L 808.56 902.29 L 806.43 903.07 L 804.27 903.84 L 802.08 904.59 L 799.86 905.32 L 797.60 906.04 L 795.31 906.75 L 792.99 907.44 L 790.63 908.12 L 788.24 908.78 L 785.81 909.43 L 783.35 910.06 L 780.84 910.68 L 778.30 911.28 L 775.71 911.87 L 773.08 912.45 L 770.41 913.01 L 767.69 913.55 L 764.93 914.09 L 762.12 914.60 L 759.26 915.11 L 756.34 915.60 L 753.38 916.07 L 750.35 916.54 L 747.27 916.98 L 744.13 917.42 L 740.92 917.84 L 737.64 918.24 L 734.30 918.63 L 730.87 919.01 L 727.38 919.38 L 723.79 919.73 L 720.12 920.06 L 716.36 920.38 L 712.50 920.69 L 708.53 920.99 L 704.45 921.27 L 700.25 921.53 L 695.91 921.79 L 691.43 922.03 L 686.80 922.25 L 681.99 922.46 L 676.99 922.66 L 671.78 922.85 L 666.34 923.02 L 660.63 923.17 L 654.61 923.32 L 648.24 923.45 L 641.45 923.56 L 634.16 923.67 L 626.25 923.75 L 617.55 923.83 L 607.79 923.89 L 596.53 923.94 L 582.87 923.97 L 564.43 923.99 L 512.00 924.00 L 459.57 923.99 L 441.13 923.97 L 427.47 923.94 L 416.21 923.89 L 406.45 923.83 L 397.75 923.75 L 389.84 923.67 L 382.55 923.56 L 375.76 923.45 L 369.39 923.32 L 363.37 923.17 L 357.66 923.02 L 352.22 922.85 L 347.01 922.66 L 342.01 922.46 L 337.20 922.25 L 332.57 922.03 L 328.09 921.79 L 323.75 921.53 L 319.55 921.27 L 315.47 920.99 L 311.50 920.69 L 307.64 920.38 L 303.88 920.06 L 300.21 919.73 L 296.62 919.38 L 293.13 919.01 L 289.70 918.63 L 286.36 918.24 L 283.08 917.84 L 279.87 917.42 L 276.73 916.98 L 273.65 916.54 L 270.62 916.07 L 267.66 915.60 L 264.74 915.11 L 261.88 914.60 L 259.07 914.09 L 256.31 913.55 L 253.59 913.01 L 250.92 912.45 L 248.29 911.87 L 245.70 911.28 L 243.16 910.68 L 240.65 910.06 L 238.19 909.43 L 235.76 908.78 L 233.37 908.12 L 231.01 907.44 L 228.69 906.75 L 226.40 906.04 L 224.14 905.32 L 221.92 904.59 L 219.73 903.84 L 217.57 903.07 L 215.44 902.29 L 213.33 901.50 L 211.26 900.69 L 209.22 899.86 L 207.20 899.02 L 205.21 898.17 L 203.25 897.30 L 201.31 896.41 L 199.40 895.51 L 197.51 894.59 L 195.65 893.66 L 193.82 892.71 L 192.01 891.75 L 190.22 890.77 L 188.45 889.77 L 186.71 888.76 L 184.99 887.73 L 183.30 886.69 L 181.62 885.63 L 179.97 884.55 L 178.34 883.46 L 176.73 882.35 L 175.14 881.22 L 173.57 880.08 L 172.02 878.92 L 170.50 877.74 L 168.99 876.55 L 167.50 875.34 L 166.03 874.11 L 164.59 872.87 L 163.16 871.60 L 161.75 870.32 L 160.36 869.02 L 158.98 867.70 L 157.63 866.37 L 156.30 865.02 L 154.98 863.64 L 153.68 862.25 L 152.40 860.84 L 151.13 859.41 L 149.89 857.97 L 148.66 856.50 L 147.45 855.01 L 146.26 853.50 L 145.08 851.98 L 143.92 850.43 L 142.78 848.86 L 141.65 847.27 L 140.54 845.66 L 139.45 844.03 L 138.37 842.38 L 137.31 840.70 L 136.27 839.01 L 135.24 837.29 L 134.23 835.55 L 133.23 833.78 L 132.25 831.99 L 131.29 830.18 L 130.34 828.35 L 129.41 826.49 L 128.49 824.60 L 127.59 822.69 L 126.70 820.75 L 125.83 818.79 L 124.98 816.80 L 124.14 814.78 L 123.31 812.74 L 122.50 810.67 L 121.71 808.56 L 120.93 806.43 L 120.16 804.27 L 119.41 802.08 L 118.68 799.86 L 117.96 797.60 L 117.25 795.31 L 116.56 792.99 L 115.88 790.63 L 115.22 788.24 L 114.57 785.81 L 113.94 783.35 L 113.32 780.84 L 112.72 778.30 L 112.13 775.71 L 111.55 773.08 L 110.99 770.41 L 110.45 767.69 L 109.91 764.93 L 109.40 762.12 L 108.89 759.26 L 108.40 756.34 L 107.93 753.38 L 107.46 750.35 L 107.02 747.27 L 106.58 744.13 L 106.16 740.92 L 105.76 737.64 L 105.37 734.30 L 104.99 730.87 L 104.62 727.38 L 104.27 723.79 L 103.94 720.12 L 103.62 716.36 L 103.31 712.50 L 103.01 708.53 L 102.73 704.45 L 102.47 700.25 L 102.21 695.91 L 101.97 691.43 L 101.75 686.80 L 101.54 681.99 L 101.34 676.99 L 101.15 671.78 L 100.98 666.34 L 100.83 660.63 L 100.68 654.61 L 100.55 648.24 L 100.44 641.45 L 100.33 634.16 L 100.25 626.25 L 100.17 617.55 L 100.11 607.79 L 100.06 596.53 L 100.03 582.87 L 100.01 564.43 L 100.00 512.00 L 100.01 459.57 L 100.03 441.13 L 100.06 427.47 L 100.11 416.21 L 100.17 406.45 L 100.25 397.75 L 100.33 389.84 L 100.44 382.55 L 100.55 375.76 L 100.68 369.39 L 100.83 363.37 L 100.98 357.66 L 101.15 352.22 L 101.34 347.01 L 101.54 342.01 L 101.75 337.20 L 101.97 332.57 L 102.21 328.09 L 102.47 323.75 L 102.73 319.55 L 103.01 315.47 L 103.31 311.50 L 103.62 307.64 L 103.94 303.88 L 104.27 300.21 L 104.62 296.62 L 104.99 293.13 L 105.37 289.70 L 105.76 286.36 L 106.16 283.08 L 106.58 279.87 L 107.02 276.73 L 107.46 273.65 L 107.93 270.62 L 108.40 267.66 L 108.89 264.74 L 109.40 261.88 L 109.91 259.07 L 110.45 256.31 L 110.99 253.59 L 111.55 250.92 L 112.13 248.29 L 112.72 245.70 L 113.32 243.16 L 113.94 240.65 L 114.57 238.19 L 115.22 235.76 L 115.88 233.37 L 116.56 231.01 L 117.25 228.69 L 117.96 226.40 L 118.68 224.14 L 119.41 221.92 L 120.16 219.73 L 120.93 217.57 L 121.71 215.44 L 122.50 213.33 L 123.31 211.26 L 124.14 209.22 L 124.98 207.20 L 125.83 205.21 L 126.70 203.25 L 127.59 201.31 L 128.49 199.40 L 129.41 197.51 L 130.34 195.65 L 131.29 193.82 L 132.25 192.01 L 133.23 190.22 L 134.23 188.45 L 135.24 186.71 L 136.27 184.99 L 137.31 183.30 L 138.37 181.62 L 139.45 179.97 L 140.54 178.34 L 141.65 176.73 L 142.78 175.14 L 143.92 173.57 L 145.08 172.02 L 146.26 170.50 L 147.45 168.99 L 148.66 167.50 L 149.89 166.03 L 151.13 164.59 L 152.40 163.16 L 153.68 161.75 L 154.98 160.36 L 156.30 158.98 L 157.63 157.63 L 158.98 156.30 L 160.36 154.98 L 161.75 153.68 L 163.16 152.40 L 164.59 151.13 L 166.03 149.89 L 167.50 148.66 L 168.99 147.45 L 170.50 146.26 L 172.02 145.08 L 173.57 143.92 L 175.14 142.78 L 176.73 141.65 L 178.34 140.54 L 179.97 139.45 L 181.62 138.37 L 183.30 137.31 L 184.99 136.27 L 186.71 135.24 L 188.45 134.23 L 190.22 133.23 L 192.01 132.25 L 193.82 131.29 L 195.65 130.34 L 197.51 129.41 L 199.40 128.49 L 201.31 127.59 L 203.25 126.70 L 205.21 125.83 L 207.20 124.98 L 209.22 124.14 L 211.26 123.31 L 213.33 122.50 L 215.44 121.71 L 217.57 120.93 L 219.73 120.16 L 221.92 119.41 L 224.14 118.68 L 226.40 117.96 L 228.69 117.25 L 231.01 116.56 L 233.37 115.88 L 235.76 115.22 L 238.19 114.57 L 240.65 113.94 L 243.16 113.32 L 245.70 112.72 L 248.29 112.13 L 250.92 111.55 L 253.59 110.99 L 256.31 110.45 L 259.07 109.91 L 261.88 109.40 L 264.74 108.89 L 267.66 108.40 L 270.62 107.93 L 273.65 107.46 L 276.73 107.02 L 279.87 106.58 L 283.08 106.16 L 286.36 105.76 L 289.70 105.37 L 293.13 104.99 L 296.62 104.62 L 300.21 104.27 L 303.88 103.94 L 307.64 103.62 L 311.50 103.31 L 315.47 103.01 L 319.55 102.73 L 323.75 102.47 L 328.09 102.21 L 332.57 101.97 L 337.20 101.75 L 342.01 101.54 L 347.01 101.34 L 352.22 101.15 L 357.66 100.98 L 363.37 100.83 L 369.39 100.68 L 375.76 100.55 L 382.55 100.44 L 389.84 100.33 L 397.75 100.25 L 406.45 100.17 L 416.21 100.11 L 427.47 100.06 L 441.13 100.03 L 459.57 100.01 L 512.00 100.00 L 564.43 100.01 L 582.87 100.03 L 596.53 100.06 L 607.79 100.11 L 617.55 100.17 L 626.25 100.25 L 634.16 100.33 L 641.45 100.44 L 648.24 100.55 L 654.61 100.68 L 660.63 100.83 L 666.34 100.98 L 671.78 101.15 L 676.99 101.34 L 681.99 101.54 L 686.80 101.75 L 691.43 101.97 L 695.91 102.21 L 700.25 102.47 L 704.45 102.73 L 708.53 103.01 L 712.50 103.31 L 716.36 103.62 L 720.12 103.94 L 723.79 104.27 L 727.38 104.62 L 730.87 104.99 L 734.30 105.37 L 737.64 105.76 L 740.92 106.16 L 744.13 106.58 L 747.27 107.02 L 750.35 107.46 L 753.38 107.93 L 756.34 108.40 L 759.26 108.89 L 762.12 109.40 L 764.93 109.91 L 767.69 110.45 L 770.41 110.99 L 773.08 111.55 L 775.71 112.13 L 778.30 112.72 L 780.84 113.32 L 783.35 113.94 L 785.81 114.57 L 788.24 115.22 L 790.63 115.88 L 792.99 116.56 L 795.31 117.25 L 797.60 117.96 L 799.86 118.68 L 802.08 119.41 L 804.27 120.16 L 806.43 120.93 L 808.56 121.71 L 810.67 122.50 L 812.74 123.31 L 814.78 124.14 L 816.80 124.98 L 818.79 125.83 L 820.75 126.70 L 822.69 127.59 L 824.60 128.49 L 826.49 129.41 L 828.35 130.34 L 830.18 131.29 L 831.99 132.25 L 833.78 133.23 L 835.55 134.23 L 837.29 135.24 L 839.01 136.27 L 840.70 137.31 L 842.38 138.37 L 844.03 139.45 L 845.66 140.54 L 847.27 141.65 L 848.86 142.78 L 850.43 143.92 L 851.98 145.08 L 853.50 146.26 L 855.01 147.45 L 856.50 148.66 L 857.97 149.89 L 859.41 151.13 L 860.84 152.40 L 862.25 153.68 L 863.64 154.98 L 865.02 156.30 L 866.37 157.63 L 867.70 158.98 L 869.02 160.36 L 870.32 161.75 L 871.60 163.16 L 872.87 164.59 L 874.11 166.03 L 875.34 167.50 L 876.55 168.99 L 877.74 170.50 L 878.92 172.02 L 880.08 173.57 L 881.22 175.14 L 882.35 176.73 L 883.46 178.34 L 884.55 179.97 L 885.63 181.62 L 886.69 183.30 L 887.73 184.99 L 888.76 186.71 L 889.77 188.45 L 890.77 190.22 L 891.75 192.01 L 892.71 193.82 L 893.66 195.65 L 894.59 197.51 L 895.51 199.40 L 896.41 201.31 L 897.30 203.25 L 898.17 205.21 L 899.02 207.20 L 899.86 209.22 L 900.69 211.26 L 901.50 213.33 L 902.29 215.44 L 903.07 217.57 L 903.84 219.73 L 904.59 221.92 L 905.32 224.14 L 906.04 226.40 L 906.75 228.69 L 907.44 231.01 L 908.12 233.37 L 908.78 235.76 L 909.43 238.19 L 910.06 240.65 L 910.68 243.16 L 911.28 245.70 L 911.87 248.29 L 912.45 250.92 L 913.01 253.59 L 913.55 256.31 L 914.09 259.07 L 914.60 261.88 L 915.11 264.74 L 915.60 267.66 L 916.07 270.62 L 916.54 273.65 L 916.98 276.73 L 917.42 279.87 L 917.84 283.08 L 918.24 286.36 L 918.63 289.70 L 919.01 293.13 L 919.38 296.62 L 919.73 300.21 L 920.06 303.88 L 920.38 307.64 L 920.69 311.50 L 920.99 315.47 L 921.27 319.55 L 921.53 323.75 L 921.79 328.09 L 922.03 332.57 L 922.25 337.20 L 922.46 342.01 L 922.66 347.01 L 922.85 352.22 L 923.02 357.66 L 923.17 363.37 L 923.32 369.39 L 923.45 375.76 L 923.56 382.55 L 923.67 389.84 L 923.75 397.75 L 923.83 406.45 L 923.89 416.21 L 923.94 427.47 L 923.97 441.13 L 923.99 459.57 Z" fill="url(#sky)"/>
22 + <g fill="#FFFFFF">
23 + <circle cx="322" cy="568" r="128"/>
24 + <circle cx="502" cy="464" r="180"/>
25 + <circle cx="700" cy="556" r="140"/>
26 + <rect x="196" y="556" width="644" height="148" rx="74"/>
27 + </g>
28 + <path d="M 420 486 H 604 L 420 626 H 604" fill="none"
29 + stroke="#3D51D6" stroke-width="86"
30 + stroke-linecap="round" stroke-linejoin="round"/>
31 + </g>
32 +</svg>
added assets/icon/zyquo-cloud-template.svg +27 −0
@@ -0,0 +1,27 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + zyquo-cloud-template.svg
4 + Zyquo Cloud
5 +
6 + Author: Simon-Pierre Boucher
7 + Mail: contact@spboucher.ai
8 +
9 + Monochrome menu-bar template glyph (rendered small, isTemplate = true):
10 + the cloud silhouette with the Z knocked out to transparency via mask.
11 +-->
12 +<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
13 + <defs>
14 + <mask id="knockZ">
15 + <rect width="1024" height="1024" fill="white"/>
16 + <path d="M 420 486 H 604 L 420 626 H 604" fill="none"
17 + stroke="black" stroke-width="86"
18 + stroke-linecap="round" stroke-linejoin="round"/>
19 + </mask>
20 + </defs>
21 + <g fill="#000000" mask="url(#knockZ)">
22 + <circle cx="322" cy="568" r="128"/>
23 + <circle cx="502" cy="464" r="180"/>
24 + <circle cx="700" cy="556" r="140"/>
25 + <rect x="196" y="556" width="644" height="148" rx="74"/>
26 + </g>
27 +</svg>
added assets/icon/zyquo-cloud.svg +78 −0
@@ -0,0 +1,78 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!--
3 + zyquo-cloud.svg
4 + Zyquo Cloud
5 +
6 + Author: Simon-Pierre Boucher
7 + Mail: contact@spboucher.ai
8 +
9 + App icon source of truth. Concept: a soft geometric cloud floating in a
10 + daylight-to-dusk sky, carrying a bold sky-indigo Z whose diagonal reads as a
11 + beam of light. Canvas: Apple-squircle (superellipse n=4.6, 824pt body on the
12 + 1024 grid). No SVG filters (rendered by CoreSVG which ignores them) — depth
13 + comes from layered gradients only.
14 +-->
15 +<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
16 + <defs>
17 + <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
18 + <stop offset="0" stop-color="#82B4FF"/>
19 + <stop offset="0.58" stop-color="#4E6AF0"/>
20 + <stop offset="1" stop-color="#3A3F9E"/>
21 + </linearGradient>
22 + <linearGradient id="topLight" x1="0" y1="0" x2="0" y2="1">
23 + <stop offset="0" stop-color="#FFFFFF" stop-opacity="0.28"/>
24 + <stop offset="0.45" stop-color="#FFFFFF" stop-opacity="0.06"/>
25 + <stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
26 + </linearGradient>
27 + <linearGradient id="cloud" gradientUnits="userSpaceOnUse" x1="512" y1="350" x2="512" y2="672">
28 + <stop offset="0" stop-color="#FFFFFF"/>
29 + <stop offset="0.72" stop-color="#F4F7FF"/>
30 + <stop offset="1" stop-color="#DfE7FB"/>
31 + </linearGradient>
32 + <linearGradient id="zed" gradientUnits="userSpaceOnUse" x1="430" y1="452" x2="600" y2="642">
33 + <stop offset="0" stop-color="#5B78F4"/>
34 + <stop offset="1" stop-color="#3A3F9E"/>
35 + </linearGradient>
36 + <linearGradient id="beam" gradientUnits="userSpaceOnUse" x1="594" y1="470" x2="430" y2="620">
37 + <stop offset="0" stop-color="#9DB9FF" stop-opacity="0.9"/>
38 + <stop offset="1" stop-color="#9DB9FF" stop-opacity="0"/>
39 + </linearGradient>
40 + <clipPath id="squircleClip"><path d="M 924.00 512.00 L 923.99 564.43 L 923.97 582.87 L 923.94 596.53 L 923.89 607.79 L 923.83 617.55 L 923.75 626.25 L 923.67 634.16 L 923.56 641.45 L 923.45 648.24 L 923.32 654.61 L 923.17 660.63 L 923.02 666.34 L 922.85 671.78 L 922.66 676.99 L 922.46 681.99 L 922.25 686.80 L 922.03 691.43 L 921.79 695.91 L 921.53 700.25 L 921.27 704.45 L 920.99 708.53 L 920.69 712.50 L 920.38 716.36 L 920.06 720.12 L 919.73 723.79 L 919.38 727.38 L 919.01 730.87 L 918.63 734.30 L 918.24 737.64 L 917.84 740.92 L 917.42 744.13 L 916.98 747.27 L 916.54 750.35 L 916.07 753.38 L 915.60 756.34 L 915.11 759.26 L 914.60 762.12 L 914.09 764.93 L 913.55 767.69 L 913.01 770.41 L 912.45 773.08 L 911.87 775.71 L 911.28 778.30 L 910.68 780.84 L 910.06 783.35 L 909.43 785.81 L 908.78 788.24 L 908.12 790.63 L 907.44 792.99 L 906.75 795.31 L 906.04 797.60 L 905.32 799.86 L 904.59 802.08 L 903.84 804.27 L 903.07 806.43 L 902.29 808.56 L 901.50 810.67 L 900.69 812.74 L 899.86 814.78 L 899.02 816.80 L 898.17 818.79 L 897.30 820.75 L 896.41 822.69 L 895.51 824.60 L 894.59 826.49 L 893.66 828.35 L 892.71 830.18 L 891.75 831.99 L 890.77 833.78 L 889.77 835.55 L 888.76 837.29 L 887.73 839.01 L 886.69 840.70 L 885.63 842.38 L 884.55 844.03 L 883.46 845.66 L 882.35 847.27 L 881.22 848.86 L 880.08 850.43 L 878.92 851.98 L 877.74 853.50 L 876.55 855.01 L 875.34 856.50 L 874.11 857.97 L 872.87 859.41 L 871.60 860.84 L 870.32 862.25 L 869.02 863.64 L 867.70 865.02 L 866.37 866.37 L 865.02 867.70 L 863.64 869.02 L 862.25 870.32 L 860.84 871.60 L 859.41 872.87 L 857.97 874.11 L 856.50 875.34 L 855.01 876.55 L 853.50 877.74 L 851.98 878.92 L 850.43 880.08 L 848.86 881.22 L 847.27 882.35 L 845.66 883.46 L 844.03 884.55 L 842.38 885.63 L 840.70 886.69 L 839.01 887.73 L 837.29 888.76 L 835.55 889.77 L 833.78 890.77 L 831.99 891.75 L 830.18 892.71 L 828.35 893.66 L 826.49 894.59 L 824.60 895.51 L 822.69 896.41 L 820.75 897.30 L 818.79 898.17 L 816.80 899.02 L 814.78 899.86 L 812.74 900.69 L 810.67 901.50 L 808.56 902.29 L 806.43 903.07 L 804.27 903.84 L 802.08 904.59 L 799.86 905.32 L 797.60 906.04 L 795.31 906.75 L 792.99 907.44 L 790.63 908.12 L 788.24 908.78 L 785.81 909.43 L 783.35 910.06 L 780.84 910.68 L 778.30 911.28 L 775.71 911.87 L 773.08 912.45 L 770.41 913.01 L 767.69 913.55 L 764.93 914.09 L 762.12 914.60 L 759.26 915.11 L 756.34 915.60 L 753.38 916.07 L 750.35 916.54 L 747.27 916.98 L 744.13 917.42 L 740.92 917.84 L 737.64 918.24 L 734.30 918.63 L 730.87 919.01 L 727.38 919.38 L 723.79 919.73 L 720.12 920.06 L 716.36 920.38 L 712.50 920.69 L 708.53 920.99 L 704.45 921.27 L 700.25 921.53 L 695.91 921.79 L 691.43 922.03 L 686.80 922.25 L 681.99 922.46 L 676.99 922.66 L 671.78 922.85 L 666.34 923.02 L 660.63 923.17 L 654.61 923.32 L 648.24 923.45 L 641.45 923.56 L 634.16 923.67 L 626.25 923.75 L 617.55 923.83 L 607.79 923.89 L 596.53 923.94 L 582.87 923.97 L 564.43 923.99 L 512.00 924.00 L 459.57 923.99 L 441.13 923.97 L 427.47 923.94 L 416.21 923.89 L 406.45 923.83 L 397.75 923.75 L 389.84 923.67 L 382.55 923.56 L 375.76 923.45 L 369.39 923.32 L 363.37 923.17 L 357.66 923.02 L 352.22 922.85 L 347.01 922.66 L 342.01 922.46 L 337.20 922.25 L 332.57 922.03 L 328.09 921.79 L 323.75 921.53 L 319.55 921.27 L 315.47 920.99 L 311.50 920.69 L 307.64 920.38 L 303.88 920.06 L 300.21 919.73 L 296.62 919.38 L 293.13 919.01 L 289.70 918.63 L 286.36 918.24 L 283.08 917.84 L 279.87 917.42 L 276.73 916.98 L 273.65 916.54 L 270.62 916.07 L 267.66 915.60 L 264.74 915.11 L 261.88 914.60 L 259.07 914.09 L 256.31 913.55 L 253.59 913.01 L 250.92 912.45 L 248.29 911.87 L 245.70 911.28 L 243.16 910.68 L 240.65 910.06 L 238.19 909.43 L 235.76 908.78 L 233.37 908.12 L 231.01 907.44 L 228.69 906.75 L 226.40 906.04 L 224.14 905.32 L 221.92 904.59 L 219.73 903.84 L 217.57 903.07 L 215.44 902.29 L 213.33 901.50 L 211.26 900.69 L 209.22 899.86 L 207.20 899.02 L 205.21 898.17 L 203.25 897.30 L 201.31 896.41 L 199.40 895.51 L 197.51 894.59 L 195.65 893.66 L 193.82 892.71 L 192.01 891.75 L 190.22 890.77 L 188.45 889.77 L 186.71 888.76 L 184.99 887.73 L 183.30 886.69 L 181.62 885.63 L 179.97 884.55 L 178.34 883.46 L 176.73 882.35 L 175.14 881.22 L 173.57 880.08 L 172.02 878.92 L 170.50 877.74 L 168.99 876.55 L 167.50 875.34 L 166.03 874.11 L 164.59 872.87 L 163.16 871.60 L 161.75 870.32 L 160.36 869.02 L 158.98 867.70 L 157.63 866.37 L 156.30 865.02 L 154.98 863.64 L 153.68 862.25 L 152.40 860.84 L 151.13 859.41 L 149.89 857.97 L 148.66 856.50 L 147.45 855.01 L 146.26 853.50 L 145.08 851.98 L 143.92 850.43 L 142.78 848.86 L 141.65 847.27 L 140.54 845.66 L 139.45 844.03 L 138.37 842.38 L 137.31 840.70 L 136.27 839.01 L 135.24 837.29 L 134.23 835.55 L 133.23 833.78 L 132.25 831.99 L 131.29 830.18 L 130.34 828.35 L 129.41 826.49 L 128.49 824.60 L 127.59 822.69 L 126.70 820.75 L 125.83 818.79 L 124.98 816.80 L 124.14 814.78 L 123.31 812.74 L 122.50 810.67 L 121.71 808.56 L 120.93 806.43 L 120.16 804.27 L 119.41 802.08 L 118.68 799.86 L 117.96 797.60 L 117.25 795.31 L 116.56 792.99 L 115.88 790.63 L 115.22 788.24 L 114.57 785.81 L 113.94 783.35 L 113.32 780.84 L 112.72 778.30 L 112.13 775.71 L 111.55 773.08 L 110.99 770.41 L 110.45 767.69 L 109.91 764.93 L 109.40 762.12 L 108.89 759.26 L 108.40 756.34 L 107.93 753.38 L 107.46 750.35 L 107.02 747.27 L 106.58 744.13 L 106.16 740.92 L 105.76 737.64 L 105.37 734.30 L 104.99 730.87 L 104.62 727.38 L 104.27 723.79 L 103.94 720.12 L 103.62 716.36 L 103.31 712.50 L 103.01 708.53 L 102.73 704.45 L 102.47 700.25 L 102.21 695.91 L 101.97 691.43 L 101.75 686.80 L 101.54 681.99 L 101.34 676.99 L 101.15 671.78 L 100.98 666.34 L 100.83 660.63 L 100.68 654.61 L 100.55 648.24 L 100.44 641.45 L 100.33 634.16 L 100.25 626.25 L 100.17 617.55 L 100.11 607.79 L 100.06 596.53 L 100.03 582.87 L 100.01 564.43 L 100.00 512.00 L 100.01 459.57 L 100.03 441.13 L 100.06 427.47 L 100.11 416.21 L 100.17 406.45 L 100.25 397.75 L 100.33 389.84 L 100.44 382.55 L 100.55 375.76 L 100.68 369.39 L 100.83 363.37 L 100.98 357.66 L 101.15 352.22 L 101.34 347.01 L 101.54 342.01 L 101.75 337.20 L 101.97 332.57 L 102.21 328.09 L 102.47 323.75 L 102.73 319.55 L 103.01 315.47 L 103.31 311.50 L 103.62 307.64 L 103.94 303.88 L 104.27 300.21 L 104.62 296.62 L 104.99 293.13 L 105.37 289.70 L 105.76 286.36 L 106.16 283.08 L 106.58 279.87 L 107.02 276.73 L 107.46 273.65 L 107.93 270.62 L 108.40 267.66 L 108.89 264.74 L 109.40 261.88 L 109.91 259.07 L 110.45 256.31 L 110.99 253.59 L 111.55 250.92 L 112.13 248.29 L 112.72 245.70 L 113.32 243.16 L 113.94 240.65 L 114.57 238.19 L 115.22 235.76 L 115.88 233.37 L 116.56 231.01 L 117.25 228.69 L 117.96 226.40 L 118.68 224.14 L 119.41 221.92 L 120.16 219.73 L 120.93 217.57 L 121.71 215.44 L 122.50 213.33 L 123.31 211.26 L 124.14 209.22 L 124.98 207.20 L 125.83 205.21 L 126.70 203.25 L 127.59 201.31 L 128.49 199.40 L 129.41 197.51 L 130.34 195.65 L 131.29 193.82 L 132.25 192.01 L 133.23 190.22 L 134.23 188.45 L 135.24 186.71 L 136.27 184.99 L 137.31 183.30 L 138.37 181.62 L 139.45 179.97 L 140.54 178.34 L 141.65 176.73 L 142.78 175.14 L 143.92 173.57 L 145.08 172.02 L 146.26 170.50 L 147.45 168.99 L 148.66 167.50 L 149.89 166.03 L 151.13 164.59 L 152.40 163.16 L 153.68 161.75 L 154.98 160.36 L 156.30 158.98 L 157.63 157.63 L 158.98 156.30 L 160.36 154.98 L 161.75 153.68 L 163.16 152.40 L 164.59 151.13 L 166.03 149.89 L 167.50 148.66 L 168.99 147.45 L 170.50 146.26 L 172.02 145.08 L 173.57 143.92 L 175.14 142.78 L 176.73 141.65 L 178.34 140.54 L 179.97 139.45 L 181.62 138.37 L 183.30 137.31 L 184.99 136.27 L 186.71 135.24 L 188.45 134.23 L 190.22 133.23 L 192.01 132.25 L 193.82 131.29 L 195.65 130.34 L 197.51 129.41 L 199.40 128.49 L 201.31 127.59 L 203.25 126.70 L 205.21 125.83 L 207.20 124.98 L 209.22 124.14 L 211.26 123.31 L 213.33 122.50 L 215.44 121.71 L 217.57 120.93 L 219.73 120.16 L 221.92 119.41 L 224.14 118.68 L 226.40 117.96 L 228.69 117.25 L 231.01 116.56 L 233.37 115.88 L 235.76 115.22 L 238.19 114.57 L 240.65 113.94 L 243.16 113.32 L 245.70 112.72 L 248.29 112.13 L 250.92 111.55 L 253.59 110.99 L 256.31 110.45 L 259.07 109.91 L 261.88 109.40 L 264.74 108.89 L 267.66 108.40 L 270.62 107.93 L 273.65 107.46 L 276.73 107.02 L 279.87 106.58 L 283.08 106.16 L 286.36 105.76 L 289.70 105.37 L 293.13 104.99 L 296.62 104.62 L 300.21 104.27 L 303.88 103.94 L 307.64 103.62 L 311.50 103.31 L 315.47 103.01 L 319.55 102.73 L 323.75 102.47 L 328.09 102.21 L 332.57 101.97 L 337.20 101.75 L 342.01 101.54 L 347.01 101.34 L 352.22 101.15 L 357.66 100.98 L 363.37 100.83 L 369.39 100.68 L 375.76 100.55 L 382.55 100.44 L 389.84 100.33 L 397.75 100.25 L 406.45 100.17 L 416.21 100.11 L 427.47 100.06 L 441.13 100.03 L 459.57 100.01 L 512.00 100.00 L 564.43 100.01 L 582.87 100.03 L 596.53 100.06 L 607.79 100.11 L 617.55 100.17 L 626.25 100.25 L 634.16 100.33 L 641.45 100.44 L 648.24 100.55 L 654.61 100.68 L 660.63 100.83 L 666.34 100.98 L 671.78 101.15 L 676.99 101.34 L 681.99 101.54 L 686.80 101.75 L 691.43 101.97 L 695.91 102.21 L 700.25 102.47 L 704.45 102.73 L 708.53 103.01 L 712.50 103.31 L 716.36 103.62 L 720.12 103.94 L 723.79 104.27 L 727.38 104.62 L 730.87 104.99 L 734.30 105.37 L 737.64 105.76 L 740.92 106.16 L 744.13 106.58 L 747.27 107.02 L 750.35 107.46 L 753.38 107.93 L 756.34 108.40 L 759.26 108.89 L 762.12 109.40 L 764.93 109.91 L 767.69 110.45 L 770.41 110.99 L 773.08 111.55 L 775.71 112.13 L 778.30 112.72 L 780.84 113.32 L 783.35 113.94 L 785.81 114.57 L 788.24 115.22 L 790.63 115.88 L 792.99 116.56 L 795.31 117.25 L 797.60 117.96 L 799.86 118.68 L 802.08 119.41 L 804.27 120.16 L 806.43 120.93 L 808.56 121.71 L 810.67 122.50 L 812.74 123.31 L 814.78 124.14 L 816.80 124.98 L 818.79 125.83 L 820.75 126.70 L 822.69 127.59 L 824.60 128.49 L 826.49 129.41 L 828.35 130.34 L 830.18 131.29 L 831.99 132.25 L 833.78 133.23 L 835.55 134.23 L 837.29 135.24 L 839.01 136.27 L 840.70 137.31 L 842.38 138.37 L 844.03 139.45 L 845.66 140.54 L 847.27 141.65 L 848.86 142.78 L 850.43 143.92 L 851.98 145.08 L 853.50 146.26 L 855.01 147.45 L 856.50 148.66 L 857.97 149.89 L 859.41 151.13 L 860.84 152.40 L 862.25 153.68 L 863.64 154.98 L 865.02 156.30 L 866.37 157.63 L 867.70 158.98 L 869.02 160.36 L 870.32 161.75 L 871.60 163.16 L 872.87 164.59 L 874.11 166.03 L 875.34 167.50 L 876.55 168.99 L 877.74 170.50 L 878.92 172.02 L 880.08 173.57 L 881.22 175.14 L 882.35 176.73 L 883.46 178.34 L 884.55 179.97 L 885.63 181.62 L 886.69 183.30 L 887.73 184.99 L 888.76 186.71 L 889.77 188.45 L 890.77 190.22 L 891.75 192.01 L 892.71 193.82 L 893.66 195.65 L 894.59 197.51 L 895.51 199.40 L 896.41 201.31 L 897.30 203.25 L 898.17 205.21 L 899.02 207.20 L 899.86 209.22 L 900.69 211.26 L 901.50 213.33 L 902.29 215.44 L 903.07 217.57 L 903.84 219.73 L 904.59 221.92 L 905.32 224.14 L 906.04 226.40 L 906.75 228.69 L 907.44 231.01 L 908.12 233.37 L 908.78 235.76 L 909.43 238.19 L 910.06 240.65 L 910.68 243.16 L 911.28 245.70 L 911.87 248.29 L 912.45 250.92 L 913.01 253.59 L 913.55 256.31 L 914.09 259.07 L 914.60 261.88 L 915.11 264.74 L 915.60 267.66 L 916.07 270.62 L 916.54 273.65 L 916.98 276.73 L 917.42 279.87 L 917.84 283.08 L 918.24 286.36 L 918.63 289.70 L 919.01 293.13 L 919.38 296.62 L 919.73 300.21 L 920.06 303.88 L 920.38 307.64 L 920.69 311.50 L 920.99 315.47 L 921.27 319.55 L 921.53 323.75 L 921.79 328.09 L 922.03 332.57 L 922.25 337.20 L 922.46 342.01 L 922.66 347.01 L 922.85 352.22 L 923.02 357.66 L 923.17 363.37 L 923.32 369.39 L 923.45 375.76 L 923.56 382.55 L 923.67 389.84 L 923.75 397.75 L 923.83 406.45 L 923.89 416.21 L 923.94 427.47 L 923.97 441.13 L 923.99 459.57 Z"/></clipPath>
41 + </defs>
42 +
43 + <!-- Squircle canvas -->
44 + <g clip-path="url(#squircleClip)">
45 + <path d="M 924.00 512.00 L 923.99 564.43 L 923.97 582.87 L 923.94 596.53 L 923.89 607.79 L 923.83 617.55 L 923.75 626.25 L 923.67 634.16 L 923.56 641.45 L 923.45 648.24 L 923.32 654.61 L 923.17 660.63 L 923.02 666.34 L 922.85 671.78 L 922.66 676.99 L 922.46 681.99 L 922.25 686.80 L 922.03 691.43 L 921.79 695.91 L 921.53 700.25 L 921.27 704.45 L 920.99 708.53 L 920.69 712.50 L 920.38 716.36 L 920.06 720.12 L 919.73 723.79 L 919.38 727.38 L 919.01 730.87 L 918.63 734.30 L 918.24 737.64 L 917.84 740.92 L 917.42 744.13 L 916.98 747.27 L 916.54 750.35 L 916.07 753.38 L 915.60 756.34 L 915.11 759.26 L 914.60 762.12 L 914.09 764.93 L 913.55 767.69 L 913.01 770.41 L 912.45 773.08 L 911.87 775.71 L 911.28 778.30 L 910.68 780.84 L 910.06 783.35 L 909.43 785.81 L 908.78 788.24 L 908.12 790.63 L 907.44 792.99 L 906.75 795.31 L 906.04 797.60 L 905.32 799.86 L 904.59 802.08 L 903.84 804.27 L 903.07 806.43 L 902.29 808.56 L 901.50 810.67 L 900.69 812.74 L 899.86 814.78 L 899.02 816.80 L 898.17 818.79 L 897.30 820.75 L 896.41 822.69 L 895.51 824.60 L 894.59 826.49 L 893.66 828.35 L 892.71 830.18 L 891.75 831.99 L 890.77 833.78 L 889.77 835.55 L 888.76 837.29 L 887.73 839.01 L 886.69 840.70 L 885.63 842.38 L 884.55 844.03 L 883.46 845.66 L 882.35 847.27 L 881.22 848.86 L 880.08 850.43 L 878.92 851.98 L 877.74 853.50 L 876.55 855.01 L 875.34 856.50 L 874.11 857.97 L 872.87 859.41 L 871.60 860.84 L 870.32 862.25 L 869.02 863.64 L 867.70 865.02 L 866.37 866.37 L 865.02 867.70 L 863.64 869.02 L 862.25 870.32 L 860.84 871.60 L 859.41 872.87 L 857.97 874.11 L 856.50 875.34 L 855.01 876.55 L 853.50 877.74 L 851.98 878.92 L 850.43 880.08 L 848.86 881.22 L 847.27 882.35 L 845.66 883.46 L 844.03 884.55 L 842.38 885.63 L 840.70 886.69 L 839.01 887.73 L 837.29 888.76 L 835.55 889.77 L 833.78 890.77 L 831.99 891.75 L 830.18 892.71 L 828.35 893.66 L 826.49 894.59 L 824.60 895.51 L 822.69 896.41 L 820.75 897.30 L 818.79 898.17 L 816.80 899.02 L 814.78 899.86 L 812.74 900.69 L 810.67 901.50 L 808.56 902.29 L 806.43 903.07 L 804.27 903.84 L 802.08 904.59 L 799.86 905.32 L 797.60 906.04 L 795.31 906.75 L 792.99 907.44 L 790.63 908.12 L 788.24 908.78 L 785.81 909.43 L 783.35 910.06 L 780.84 910.68 L 778.30 911.28 L 775.71 911.87 L 773.08 912.45 L 770.41 913.01 L 767.69 913.55 L 764.93 914.09 L 762.12 914.60 L 759.26 915.11 L 756.34 915.60 L 753.38 916.07 L 750.35 916.54 L 747.27 916.98 L 744.13 917.42 L 740.92 917.84 L 737.64 918.24 L 734.30 918.63 L 730.87 919.01 L 727.38 919.38 L 723.79 919.73 L 720.12 920.06 L 716.36 920.38 L 712.50 920.69 L 708.53 920.99 L 704.45 921.27 L 700.25 921.53 L 695.91 921.79 L 691.43 922.03 L 686.80 922.25 L 681.99 922.46 L 676.99 922.66 L 671.78 922.85 L 666.34 923.02 L 660.63 923.17 L 654.61 923.32 L 648.24 923.45 L 641.45 923.56 L 634.16 923.67 L 626.25 923.75 L 617.55 923.83 L 607.79 923.89 L 596.53 923.94 L 582.87 923.97 L 564.43 923.99 L 512.00 924.00 L 459.57 923.99 L 441.13 923.97 L 427.47 923.94 L 416.21 923.89 L 406.45 923.83 L 397.75 923.75 L 389.84 923.67 L 382.55 923.56 L 375.76 923.45 L 369.39 923.32 L 363.37 923.17 L 357.66 923.02 L 352.22 922.85 L 347.01 922.66 L 342.01 922.46 L 337.20 922.25 L 332.57 922.03 L 328.09 921.79 L 323.75 921.53 L 319.55 921.27 L 315.47 920.99 L 311.50 920.69 L 307.64 920.38 L 303.88 920.06 L 300.21 919.73 L 296.62 919.38 L 293.13 919.01 L 289.70 918.63 L 286.36 918.24 L 283.08 917.84 L 279.87 917.42 L 276.73 916.98 L 273.65 916.54 L 270.62 916.07 L 267.66 915.60 L 264.74 915.11 L 261.88 914.60 L 259.07 914.09 L 256.31 913.55 L 253.59 913.01 L 250.92 912.45 L 248.29 911.87 L 245.70 911.28 L 243.16 910.68 L 240.65 910.06 L 238.19 909.43 L 235.76 908.78 L 233.37 908.12 L 231.01 907.44 L 228.69 906.75 L 226.40 906.04 L 224.14 905.32 L 221.92 904.59 L 219.73 903.84 L 217.57 903.07 L 215.44 902.29 L 213.33 901.50 L 211.26 900.69 L 209.22 899.86 L 207.20 899.02 L 205.21 898.17 L 203.25 897.30 L 201.31 896.41 L 199.40 895.51 L 197.51 894.59 L 195.65 893.66 L 193.82 892.71 L 192.01 891.75 L 190.22 890.77 L 188.45 889.77 L 186.71 888.76 L 184.99 887.73 L 183.30 886.69 L 181.62 885.63 L 179.97 884.55 L 178.34 883.46 L 176.73 882.35 L 175.14 881.22 L 173.57 880.08 L 172.02 878.92 L 170.50 877.74 L 168.99 876.55 L 167.50 875.34 L 166.03 874.11 L 164.59 872.87 L 163.16 871.60 L 161.75 870.32 L 160.36 869.02 L 158.98 867.70 L 157.63 866.37 L 156.30 865.02 L 154.98 863.64 L 153.68 862.25 L 152.40 860.84 L 151.13 859.41 L 149.89 857.97 L 148.66 856.50 L 147.45 855.01 L 146.26 853.50 L 145.08 851.98 L 143.92 850.43 L 142.78 848.86 L 141.65 847.27 L 140.54 845.66 L 139.45 844.03 L 138.37 842.38 L 137.31 840.70 L 136.27 839.01 L 135.24 837.29 L 134.23 835.55 L 133.23 833.78 L 132.25 831.99 L 131.29 830.18 L 130.34 828.35 L 129.41 826.49 L 128.49 824.60 L 127.59 822.69 L 126.70 820.75 L 125.83 818.79 L 124.98 816.80 L 124.14 814.78 L 123.31 812.74 L 122.50 810.67 L 121.71 808.56 L 120.93 806.43 L 120.16 804.27 L 119.41 802.08 L 118.68 799.86 L 117.96 797.60 L 117.25 795.31 L 116.56 792.99 L 115.88 790.63 L 115.22 788.24 L 114.57 785.81 L 113.94 783.35 L 113.32 780.84 L 112.72 778.30 L 112.13 775.71 L 111.55 773.08 L 110.99 770.41 L 110.45 767.69 L 109.91 764.93 L 109.40 762.12 L 108.89 759.26 L 108.40 756.34 L 107.93 753.38 L 107.46 750.35 L 107.02 747.27 L 106.58 744.13 L 106.16 740.92 L 105.76 737.64 L 105.37 734.30 L 104.99 730.87 L 104.62 727.38 L 104.27 723.79 L 103.94 720.12 L 103.62 716.36 L 103.31 712.50 L 103.01 708.53 L 102.73 704.45 L 102.47 700.25 L 102.21 695.91 L 101.97 691.43 L 101.75 686.80 L 101.54 681.99 L 101.34 676.99 L 101.15 671.78 L 100.98 666.34 L 100.83 660.63 L 100.68 654.61 L 100.55 648.24 L 100.44 641.45 L 100.33 634.16 L 100.25 626.25 L 100.17 617.55 L 100.11 607.79 L 100.06 596.53 L 100.03 582.87 L 100.01 564.43 L 100.00 512.00 L 100.01 459.57 L 100.03 441.13 L 100.06 427.47 L 100.11 416.21 L 100.17 406.45 L 100.25 397.75 L 100.33 389.84 L 100.44 382.55 L 100.55 375.76 L 100.68 369.39 L 100.83 363.37 L 100.98 357.66 L 101.15 352.22 L 101.34 347.01 L 101.54 342.01 L 101.75 337.20 L 101.97 332.57 L 102.21 328.09 L 102.47 323.75 L 102.73 319.55 L 103.01 315.47 L 103.31 311.50 L 103.62 307.64 L 103.94 303.88 L 104.27 300.21 L 104.62 296.62 L 104.99 293.13 L 105.37 289.70 L 105.76 286.36 L 106.16 283.08 L 106.58 279.87 L 107.02 276.73 L 107.46 273.65 L 107.93 270.62 L 108.40 267.66 L 108.89 264.74 L 109.40 261.88 L 109.91 259.07 L 110.45 256.31 L 110.99 253.59 L 111.55 250.92 L 112.13 248.29 L 112.72 245.70 L 113.32 243.16 L 113.94 240.65 L 114.57 238.19 L 115.22 235.76 L 115.88 233.37 L 116.56 231.01 L 117.25 228.69 L 117.96 226.40 L 118.68 224.14 L 119.41 221.92 L 120.16 219.73 L 120.93 217.57 L 121.71 215.44 L 122.50 213.33 L 123.31 211.26 L 124.14 209.22 L 124.98 207.20 L 125.83 205.21 L 126.70 203.25 L 127.59 201.31 L 128.49 199.40 L 129.41 197.51 L 130.34 195.65 L 131.29 193.82 L 132.25 192.01 L 133.23 190.22 L 134.23 188.45 L 135.24 186.71 L 136.27 184.99 L 137.31 183.30 L 138.37 181.62 L 139.45 179.97 L 140.54 178.34 L 141.65 176.73 L 142.78 175.14 L 143.92 173.57 L 145.08 172.02 L 146.26 170.50 L 147.45 168.99 L 148.66 167.50 L 149.89 166.03 L 151.13 164.59 L 152.40 163.16 L 153.68 161.75 L 154.98 160.36 L 156.30 158.98 L 157.63 157.63 L 158.98 156.30 L 160.36 154.98 L 161.75 153.68 L 163.16 152.40 L 164.59 151.13 L 166.03 149.89 L 167.50 148.66 L 168.99 147.45 L 170.50 146.26 L 172.02 145.08 L 173.57 143.92 L 175.14 142.78 L 176.73 141.65 L 178.34 140.54 L 179.97 139.45 L 181.62 138.37 L 183.30 137.31 L 184.99 136.27 L 186.71 135.24 L 188.45 134.23 L 190.22 133.23 L 192.01 132.25 L 193.82 131.29 L 195.65 130.34 L 197.51 129.41 L 199.40 128.49 L 201.31 127.59 L 203.25 126.70 L 205.21 125.83 L 207.20 124.98 L 209.22 124.14 L 211.26 123.31 L 213.33 122.50 L 215.44 121.71 L 217.57 120.93 L 219.73 120.16 L 221.92 119.41 L 224.14 118.68 L 226.40 117.96 L 228.69 117.25 L 231.01 116.56 L 233.37 115.88 L 235.76 115.22 L 238.19 114.57 L 240.65 113.94 L 243.16 113.32 L 245.70 112.72 L 248.29 112.13 L 250.92 111.55 L 253.59 110.99 L 256.31 110.45 L 259.07 109.91 L 261.88 109.40 L 264.74 108.89 L 267.66 108.40 L 270.62 107.93 L 273.65 107.46 L 276.73 107.02 L 279.87 106.58 L 283.08 106.16 L 286.36 105.76 L 289.70 105.37 L 293.13 104.99 L 296.62 104.62 L 300.21 104.27 L 303.88 103.94 L 307.64 103.62 L 311.50 103.31 L 315.47 103.01 L 319.55 102.73 L 323.75 102.47 L 328.09 102.21 L 332.57 101.97 L 337.20 101.75 L 342.01 101.54 L 347.01 101.34 L 352.22 101.15 L 357.66 100.98 L 363.37 100.83 L 369.39 100.68 L 375.76 100.55 L 382.55 100.44 L 389.84 100.33 L 397.75 100.25 L 406.45 100.17 L 416.21 100.11 L 427.47 100.06 L 441.13 100.03 L 459.57 100.01 L 512.00 100.00 L 564.43 100.01 L 582.87 100.03 L 596.53 100.06 L 607.79 100.11 L 617.55 100.17 L 626.25 100.25 L 634.16 100.33 L 641.45 100.44 L 648.24 100.55 L 654.61 100.68 L 660.63 100.83 L 666.34 100.98 L 671.78 101.15 L 676.99 101.34 L 681.99 101.54 L 686.80 101.75 L 691.43 101.97 L 695.91 102.21 L 700.25 102.47 L 704.45 102.73 L 708.53 103.01 L 712.50 103.31 L 716.36 103.62 L 720.12 103.94 L 723.79 104.27 L 727.38 104.62 L 730.87 104.99 L 734.30 105.37 L 737.64 105.76 L 740.92 106.16 L 744.13 106.58 L 747.27 107.02 L 750.35 107.46 L 753.38 107.93 L 756.34 108.40 L 759.26 108.89 L 762.12 109.40 L 764.93 109.91 L 767.69 110.45 L 770.41 110.99 L 773.08 111.55 L 775.71 112.13 L 778.30 112.72 L 780.84 113.32 L 783.35 113.94 L 785.81 114.57 L 788.24 115.22 L 790.63 115.88 L 792.99 116.56 L 795.31 117.25 L 797.60 117.96 L 799.86 118.68 L 802.08 119.41 L 804.27 120.16 L 806.43 120.93 L 808.56 121.71 L 810.67 122.50 L 812.74 123.31 L 814.78 124.14 L 816.80 124.98 L 818.79 125.83 L 820.75 126.70 L 822.69 127.59 L 824.60 128.49 L 826.49 129.41 L 828.35 130.34 L 830.18 131.29 L 831.99 132.25 L 833.78 133.23 L 835.55 134.23 L 837.29 135.24 L 839.01 136.27 L 840.70 137.31 L 842.38 138.37 L 844.03 139.45 L 845.66 140.54 L 847.27 141.65 L 848.86 142.78 L 850.43 143.92 L 851.98 145.08 L 853.50 146.26 L 855.01 147.45 L 856.50 148.66 L 857.97 149.89 L 859.41 151.13 L 860.84 152.40 L 862.25 153.68 L 863.64 154.98 L 865.02 156.30 L 866.37 157.63 L 867.70 158.98 L 869.02 160.36 L 870.32 161.75 L 871.60 163.16 L 872.87 164.59 L 874.11 166.03 L 875.34 167.50 L 876.55 168.99 L 877.74 170.50 L 878.92 172.02 L 880.08 173.57 L 881.22 175.14 L 882.35 176.73 L 883.46 178.34 L 884.55 179.97 L 885.63 181.62 L 886.69 183.30 L 887.73 184.99 L 888.76 186.71 L 889.77 188.45 L 890.77 190.22 L 891.75 192.01 L 892.71 193.82 L 893.66 195.65 L 894.59 197.51 L 895.51 199.40 L 896.41 201.31 L 897.30 203.25 L 898.17 205.21 L 899.02 207.20 L 899.86 209.22 L 900.69 211.26 L 901.50 213.33 L 902.29 215.44 L 903.07 217.57 L 903.84 219.73 L 904.59 221.92 L 905.32 224.14 L 906.04 226.40 L 906.75 228.69 L 907.44 231.01 L 908.12 233.37 L 908.78 235.76 L 909.43 238.19 L 910.06 240.65 L 910.68 243.16 L 911.28 245.70 L 911.87 248.29 L 912.45 250.92 L 913.01 253.59 L 913.55 256.31 L 914.09 259.07 L 914.60 261.88 L 915.11 264.74 L 915.60 267.66 L 916.07 270.62 L 916.54 273.65 L 916.98 276.73 L 917.42 279.87 L 917.84 283.08 L 918.24 286.36 L 918.63 289.70 L 919.01 293.13 L 919.38 296.62 L 919.73 300.21 L 920.06 303.88 L 920.38 307.64 L 920.69 311.50 L 920.99 315.47 L 921.27 319.55 L 921.53 323.75 L 921.79 328.09 L 922.03 332.57 L 922.25 337.20 L 922.46 342.01 L 922.66 347.01 L 922.85 352.22 L 923.02 357.66 L 923.17 363.37 L 923.32 369.39 L 923.45 375.76 L 923.56 382.55 L 923.67 389.84 L 923.75 397.75 L 923.83 406.45 L 923.89 416.21 L 923.94 427.47 L 923.97 441.13 L 923.99 459.57 Z" fill="url(#sky)"/>
46 + <!-- soft top light -->
47 + <rect x="100" y="100" width="824" height="500" fill="url(#topLight)"/>
48 +
49 + <!-- distant cloud layer (parallax depth) -->
50 + <g fill="#FFFFFF" opacity="0.16">
51 + <circle cx="742" cy="306" r="42"/>
52 + <circle cx="796" cy="286" r="56"/>
53 + <circle cx="856" cy="308" r="40"/>
54 + <rect x="712" y="296" width="182" height="52" rx="26"/>
55 + </g>
56 + <g fill="#FFFFFF" opacity="0.10">
57 + <circle cx="196" cy="742" r="34"/>
58 + <circle cx="244" cy="726" r="44"/>
59 + <circle cx="292" cy="744" r="32"/>
60 + <rect x="172" y="734" width="152" height="42" rx="21"/>
61 + </g>
62 +
63 + <!-- main cloud: overlapping lobes share one user-space gradient (seamless) -->
64 + <g fill="url(#cloud)">
65 + <circle cx="348" cy="560" r="98"/>
66 + <circle cx="496" cy="482" r="140"/>
67 + <circle cx="652" cy="552" r="108"/>
68 + <rect x="250" y="556" width="510" height="112" rx="56"/>
69 + </g>
70 +
71 + <!-- Z monogram, diagonal doubles as a luminous beam -->
72 + <path d="M 436 476 H 588 L 436 614 H 588" fill="none"
73 + stroke="url(#zed)" stroke-width="58"
74 + stroke-linecap="round" stroke-linejoin="round"/>
75 + <path d="M 588 476 L 436 614" fill="none"
76 + stroke="url(#beam)" stroke-width="58" stroke-linecap="round"/>
77 + </g>
78 +</svg>
added docs/research/catalog-summary.md +54 −0
@@ -0,0 +1,54 @@
1 +<!--
2 + catalog-summary.md
3 + Zyquo Cloud
4 +
5 + Author: Simon-Pierre Boucher
6 + Mail: contact@spboucher.ai
7 +-->
8 +
9 +# Built-in Catalog Summary — ModelCatalogData.swift
10 +
11 +Generated 2026-07-30 from the per-provider research files in `docs/research/`.
12 +Audit companion for `Sources/ZyquoCloud/Services/ModelCatalogData.swift` — use this
13 +to detect drift between research and the shipped catalog. **Total shipped: 195 chat models.**
14 +
15 +Global exclusion policy (applies to every provider): embeddings, audio (TTS/ASR/realtime/omni-audio),
16 +image/video generation, moderation, OCR, robotics, computer-use, deep-research agent products,
17 +and Responses-API-only models are never shipped.
18 +
19 +| Provider | Included | Excluded / trimmed | Why excluded |
20 +|---|---|---|---|
21 +| OpenAI | 29 | ~100 live IDs | All `*-pro` (gpt-5.5-pro, gpt-5.4-pro, gpt-5.2-pro, gpt-5-pro, o3-pro, o1-pro), all `*-codex*`, `*deep-research*` (Responses API only); `ra-gpt-5.6-sol` (undocumented/experimental); `gpt-5-search-api`, `gpt-4o[-mini]-search-preview` (search-fee SKUs, unverified pricing); dated snapshots (alias kept); embeddings/audio/image/realtime/moderation/sora/davinci/babbage IDs |
22 +| Anthropic | 11 | 1+ | `claude-mythos-5` (invite-only, Project Glasswing); dated aliases of 4.5-family kept as canonical dated IDs per research table |
23 +| xAI | 6 | 4 | `grok-imagine-image[-quality]`, `grok-imagine-video[-1.5]` (image/video gen); retired models (grok-4, grok-4-fast, grok-3, grok-2-vision) absent from live `/models`; dated variants shipped via stable aliases (grok-4.20 etc.) |
24 +| Mistral | 10 | ~10 | `voxtral-*` (audio), `mistral-embed*`, `codestral-embed*`, `mistral-moderation-*`, `mistral-ocr-*`, `labs-leanstral-*`, `mistral-vibe-cli-*` (product aliases); dated snapshots (kept `-latest` aliases only); `magistral-small-2509`/`mistral-small-2506` (deprecated 07-31, replaced by mistral-small-latest); `mistral-medium-2508/2505` (dated legacy snapshots) |
25 +| Gemini | 17 | ~25 | TTS, image (incl. nano-banana), Imagen/Veo/Lyria, embeddings, Live/native-audio, robotics, computer-use, `aqa`, `antigravity-preview`, `deep-research-*` (agent products); trimmed previews: `gemini-3.1-pro-preview-customtools`, `gemini-3.1-flash-lite-preview`, `gemini-omni-flash-preview` (redundant/unverified preview channels) |
26 +| Qwen | 32 | ~119 of 151 live | Image/video (`qwen-image*`, `wan*`, `z-image*`), TTS/ASR, omni/realtime/s2s, live-translate, MT (`qwen-mt-*`), OCR, embeddings; all dated snapshots (aliases kept); `ccai-pro` (unidentified), `qwen3.6-max-preview`, `glm-5.2-fast-preview` (previews), `deepseek-v3.2`, `glm-5.1` (superseded third-party), `qwen-vl-max/plus` (legacy VL, superseded by qwen3-vl), `qwen3-235b-a22b` (streaming-only hybrid), small open weights (qwen3-32b/30b/14b/8b, qwen3.5-27b, qwen3.6-35b/27b, qwen2-7b) trimmed per curation cap |
27 +| DeepSeek | 2 | 2 retired | `deepseek-chat` and `deepseek-reasoner` retired 2026-07-24 (no longer resolve) — only the V4 pair exists |
28 +| Kimi | 12 | 0 | All 12 live models are chat models; nothing excluded |
29 +| Perplexity | 4 | 1 | `sonar-reasoning` (non-Pro) removed from the current docs enum; Agent API models out of scope (different endpoint) |
30 +| Together | 34 | ~144 of 178 chat/language entries | Dedicated-endpoint / 0-priced artifacts (GLM-4.7-fp4, GLM-5-FP4, Qwen 35B FP8 variants, MiniMax-M2, pearl-ai mirrors…); trimmed niche/duplicated: Kimi-K2.5-fp4, MiniMax-M2.7, GLM-4.5-Air, Llama-3.1-405B (probe ctx quirk), Llama-3.1-70B (superseded by 3.3), Llama-3.2-3B, Qwen2.5 family, Mistral-Small-24B-2501, gemma-3n, Nemotron-Nano-9B, cogito, LFM2.5, trinity-mini, Hermes/roleplay models, Llama-Guard (moderation) |
31 +| DeepInfra | 35 | ~139 of 174 | Image/video/TTS/ASR entries (null context/pricing); trimmed duplicates/niche: claude-opus-4-7, claude-sonnet-4-6 (older proxied gens), DeepSeek-V3.2/V3.1-Terminus/V3-0324, GLM-5.1/4.7-Flash/4.6, Qwen3.6/3.5 mid-size variants, Qwen3-Max[-Thinking], Qwen3-Next-80B, Qwen3-VL-30B, phi-4, Mistral-Nemo, gemma-3-27b, Hy3, Step-3.7-Flash, MiMo, Seed-2.0, Inkling, Nemotron Super/Nano, Hermes/MythoMax/roleplay, Llama-Guard |
32 +| Cerebras | 3 | 0 | Live catalog is exactly 3 public models; `zai-glm-4.7` shipped flagged legacy (discontinuation 2026-08-17) |
33 +
34 +## Flag conventions used
35 +
36 +- `isRecommended` (max 4 per provider): OpenAI gpt-5.6-sol/terra; Anthropic claude-opus-5/sonnet-5;
37 + xAI grok-4.5/grok-code-fast-1; Mistral medium/large/small-latest; Gemini 3.6-flash/3.5-flash-lite/3.1-pro-preview;
38 + Qwen qwen3.7-max/plus/flash; DeepSeek both; Kimi k3/k2.7-code; Perplexity sonar/sonar-pro;
39 + Together Kimi-K3/DeepSeek-V4-Pro/gpt-oss-120b; DeepInfra DeepSeek-V4-Pro/V4-Flash/GLM-5.2/gpt-oss-120b;
40 + Cerebras gpt-oss-120b.
41 +- `isLegacy`: OpenAI gpt-4.1/4o/4/3.5 families, gpt-4-turbo, o1, o3-mini; Anthropic 4.5-and-earlier dated
42 + models; Mistral magistral-medium/devstral/open-mistral-nemo; Gemini 2.0 family; Qwen qwen-turbo;
43 + Kimi moonshot-v1 family; Together Mixtral-8x7B; Cerebras zai-glm-4.7.
44 +
45 +## Notable data-entry decisions (verify in Phase 7)
46 +
47 +- OpenAI reasoning models use `ParameterSupport(temperature: false, topP: false, usesMaxCompletionTokens: true, reasoningEffort: true)`; `*chat-latest` models use `.openAIDefault`.
48 +- Anthropic 4.7+/5-generation models: sampling disabled, `thinkingToggle: true`; Fable 5 has `thinkingToggle: false` (thinking always on, cannot be disabled); 4.6-and-earlier keep temperature/topP.
49 +- Kimi: research documents `reasoning_effort` only on `kimi-k3` (K2.5/K2.6 use the `thinking` object → `thinkingToggle`; K2.7-code thinking is always-on, no toggle/effort) — this deviates deliberately from the blanket "K-series reasoningEffort" guidance to match the documented API. K-series hides sampling sliders and prefers `max_completion_tokens`.
50 +- Qwen third-party pricing is unpublished on the intl docs → `pricing: nil` for most Qwen entries (3p figures kept only for the qwen3.7 tier); `enable_thinking` mapped to `thinkingToggle`.
51 +- Perplexity: all 4 models carry `citations: true`, no vision, no tools; context windows are tracker-sourced (unverified).
52 +- Cerebras context windows use the paid tier (131K); free tier caps at 65K.
53 +- DeepSeek pricing uses cache-miss input rates; both models get `reasoningEffort` + `thinkingToggle`.
54 +- Together/DeepInfra `maxOutputTokens` is `nil` throughout (listings expose no distinct output cap).
added scripts/generate-icon.sh +47 −0
@@ -0,0 +1,47 @@
1 +#!/bin/bash
2 +#
3 +# generate-icon.sh
4 +# Zyquo Cloud
5 +#
6 +# Author: Simon-Pierre Boucher
7 +# Mail: contact@spboucher.ai
8 +#
9 +# SVG → Resources/AppIcon.icns + menu bar template PNGs.
10 +# Sources of truth: assets/icon/zyquo-cloud.svg (128px+ slots),
11 +# assets/icon/zyquo-cloud-small.svg (16/32px slots — simplified variant),
12 +# assets/icon/zyquo-cloud-template.svg (menu bar glyph).
13 +# Rasterized with scripts/rasterize-svg.swift (AppKit/CoreSVG; librsvg not
14 +# installed on this machine).
15 +#
16 +set -euo pipefail
17 +cd "$(dirname "$0")/.."
18 +
19 +SVG=assets/icon/zyquo-cloud.svg
20 +SVG_SMALL=assets/icon/zyquo-cloud-small.svg
21 +SVG_TEMPLATE=assets/icon/zyquo-cloud-template.svg
22 +ICONSET=$(mktemp -d)/AppIcon.iconset
23 +mkdir -p "$ICONSET" Resources
24 +
25 +render() { swift scripts/rasterize-svg.swift "$1" "$2" "$3"; }
26 +
27 +echo "=== Rendering iconset ==="
28 +render "$SVG_SMALL" "$ICONSET/icon_16x16.png" 16
29 +render "$SVG_SMALL" "$ICONSET/icon_16x16@2x.png" 32
30 +render "$SVG_SMALL" "$ICONSET/icon_32x32.png" 32
31 +render "$SVG_SMALL" "$ICONSET/icon_32x32@2x.png" 64
32 +render "$SVG" "$ICONSET/icon_128x128.png" 128
33 +render "$SVG" "$ICONSET/icon_128x128@2x.png" 256
34 +render "$SVG" "$ICONSET/icon_256x256.png" 256
35 +render "$SVG" "$ICONSET/icon_256x256@2x.png" 512
36 +render "$SVG" "$ICONSET/icon_512x512.png" 512
37 +render "$SVG" "$ICONSET/icon_512x512@2x.png" 1024
38 +
39 +echo "=== Building icns ==="
40 +iconutil -c icns "$ICONSET" -o Resources/AppIcon.icns
41 +
42 +echo "=== Menu bar template icon (18pt @1x/@2x) ==="
43 +render "$SVG_TEMPLATE" Resources/MenuBarIcon.png 18
44 +render "$SVG_TEMPLATE" Resources/MenuBarIcon@2x.png 36
45 +
46 +rm -rf "$(dirname "$ICONSET")"
47 +echo "Done: Resources/AppIcon.icns + Resources/MenuBarIcon(@2x).png"
added scripts/rasterize-svg.swift +44 −0
@@ -0,0 +1,44 @@
1 +#!/usr/bin/swift
2 +//
3 +// rasterize-svg.swift
4 +// Zyquo Cloud
5 +//
6 +// Author: Simon-Pierre Boucher
7 +// Mail: contact@spboucher.ai
8 +//
9 +// Renders an SVG to PNG at a given pixel size using AppKit's native SVG
10 +// support (CoreSVG) — used because librsvg isn't installed on this machine.
11 +// Usage: swift rasterize-svg.swift <in.svg> <out.png> <size>
12 +//
13 +
14 +import AppKit
15 +
16 +let args = CommandLine.arguments
17 +guard args.count == 4, let size = Int(args[3]) else {
18 + FileHandle.standardError.write(Data("usage: rasterize-svg.swift <in.svg> <out.png> <size>\n".utf8))
19 + exit(64)
20 +}
21 +
22 +guard let image = NSImage(contentsOfFile: args[1]) else {
23 + FileHandle.standardError.write(Data("error: cannot load \(args[1])\n".utf8))
24 + exit(1)
25 +}
26 +
27 +let pixels = CGFloat(size)
28 +guard let rep = NSBitmapImageRep(
29 + bitmapDataPlanes: nil, pixelsWide: size, pixelsHigh: size,
30 + bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false,
31 + colorSpaceName: .calibratedRGB, bytesPerRow: 0, bitsPerPixel: 0
32 +) else { exit(1) }
33 +
34 +NSGraphicsContext.saveGraphicsState()
35 +NSGraphicsContext.current = NSGraphicsContext(bitmapImageRep: rep)
36 +NSGraphicsContext.current?.imageInterpolation = .high
37 +image.draw(
38 + in: NSRect(x: 0, y: 0, width: pixels, height: pixels),
39 + from: .zero, operation: .copy, fraction: 1
40 +)
41 +NSGraphicsContext.restoreGraphicsState()
42 +
43 +guard let png = rep.representation(using: .png, properties: [:]) else { exit(1) }
44 +try! png.write(to: URL(fileURLWithPath: args[2]))
45