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%

phase7: Together completions-style text field, remove broken DeepInfra gemma-4-31B, bump OK-test budget

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

Showing 5 changed files with +225 and −16

modified Sources/ZyquoCloud/Providers/OpenAICompatibleClient.swift +8 −4
@@ -119,10 +119,13 @@ struct OpenAICompatibleClient: ProviderClient {
119 119 private struct WireChoice: Decodable {
120 120 var delta: WireDelta?
121 121 var message: WireDelta?
122 + /// Together streams some models completions-style: the token text
123 + /// lives in `choices[].text` instead of `delta.content`.
124 + var text: String?
122 125 var finishReason: String?
123 126
124 127 enum CodingKeys: String, CodingKey {
125 case delta, message
128 + case delta, message, text
126 129 case finishReason = "finish_reason"
127 130 }
128 131 }
@@ -342,8 +345,9 @@ struct OpenAICompatibleClient: ProviderClient {
342 345 !reasoning.isEmpty {
343 346 continuation.yield(.reasoningDelta(reasoning))
344 347 }
345 if let text = choice.delta?.content, !text.isEmpty {
346 continuation.yield(.textDelta(text))
348 + let deltaText = choice.delta?.content ?? choice.text
349 + if let deltaText, !deltaText.isEmpty {
350 + continuation.yield(.textDelta(deltaText))
347 351 }
348 352 if let reason = choice.finishReason {
349 353 finishReason = reason
@@ -383,7 +387,7 @@ struct OpenAICompatibleClient: ProviderClient {
383 387 }
384 388 var message = Message(
385 389 role: .assistant,
386 text: content.content ?? "",
390 + text: content.content ?? choice.text ?? "",
387 391 reasoning: content.reasoningContent ?? content.reasoning,
388 392 modelID: request.model.id,
389 393 provider: providerID
modified Sources/ZyquoCloud/Services/ModelCatalogData.swift +2 −7
@@ -1321,13 +1321,8 @@ enum ModelCatalogData {
1321 1321 pricing: ModelPricing(inputPerMTok: 0.075, outputPerMTok: 0.20),
1322 1322 parameterSupport: .openAIDefault
1323 1323 ),
1324 AIModel(
1325 id: "google/gemma-4-31B-it", provider: .deepinfra, displayName: "Gemma 4 31B",
1326 contextWindow: 262_144, maxOutputTokens: nil,
1327 capabilities: ModelCapabilities(vision: true, tools: true, jsonMode: true),
1328 pricing: ModelPricing(inputPerMTok: 0.13, outputPerMTok: 0.38),
1329 parameterSupport: .openAIDefault
1330 ),
1324 + // google/gemma-4-31B-it removed 2026-07-30: endpoint hangs (60s+, zero
1325 + // bytes) on chat completions — see docs/PROVIDERS.md Phase 7 amendments.
1331 1326 ]
1332 1327
1333 1328 // MARK: - Cerebras
modified Sources/ZyquoCloud/Verify/VerifyHarness.swift +1 −1
@@ -175,7 +175,7 @@ enum VerifyHarness {
175 175 )
176 176 }
177 177 let start = Date()
178 var parameters = ChatParameters(maxTokens: model.capabilities.reasoning ? 4096 : 64)
178 + var parameters = ChatParameters(maxTokens: model.capabilities.reasoning ? 4096 : 256)
179 179 if model.parameterSupport.reasoningEffort {
180 180 parameters.reasoningEffort = "low"
181 181 }
modified docs/PROVIDERS.md +9 −0
@@ -1706,3 +1706,12 @@ Live-key verification (Phase 7 harness) against the real APIs produced the follo
1706 1706 - xAI aliases `grok-4.20`, `grok-4.20-non-reasoning`, and `grok-code-fast-1` resolve on chat completions but do not appear in `/models` — the harness keeps them on an allowlist.
1707 1707 - xAI and Qwen vision endpoints reject images smaller than 8px — the vision harness now uses a 64×64 test image.
1708 1708 - `sonar-deep-research` (Perplexity) is skipped in the bulk sweep — it launches multi-minute agentic research runs unsuitable for automated verification.
1709 +
1710 +### Second-pass amendments (2026-07-30, run 2)
1711 +
1712 +- **Together streams some models completions-style** (`choices[].text` instead of `delta.content`)
1713 + — observed on `Qwen/Qwen3.5-9B` and `google/gemma-4-31B-it`; client now falls back to `choices[].text`.
1714 +- **DeepInfra `google/gemma-4-31B-it` removed**: chat completions hang (60s+, zero bytes received) —
1715 + broken/cold endpoint, reproduced with curl.
1716 +- `gpt-5.3-chat-latest` returned an empty completion once at a 64-token cap; verified fine at 512
1717 + (`reasoning_tokens: 0`) — harness bumped its non-reasoning budget to 256.
modified docs/VERIFICATION.md +205 −4
@@ -5,12 +5,213 @@
5 5 Mail: contact@spboucher.ai
6 6 -->
7 7
8 # API Verification Results — 2026-07-30T12:44:55Z
8 +# API Verification Results — 2026-07-30T12:47:26Z
9 9
10 **3 tests · 3 passed · 0 failed**
10 +**204 tests · 199 passed · 5 failed**
11 11
12 12 | Provider | Model | Test | Result | Latency | Detail |
13 13 |---|---|---|---|---|---|
14 +| Anthropic | `—` | models | ✅ | 0.3s | 11 live |
15 +| Anthropic | `claude-fable-5` | chat | ✅ | 2.5s | |
16 +| Anthropic | `claude-haiku-4-5-20251001` | chat | ✅ | 0.7s | |
17 +| Anthropic | `claude-opus-4-1-20250805` | chat | ✅ | 1.9s | |
18 +| Anthropic | `claude-opus-4-5-20251101` | chat | ✅ | 1.3s | |
19 +| Anthropic | `claude-opus-4-6` | chat | ✅ | 2.2s | |
20 +| Anthropic | `claude-opus-4-7` | chat | ✅ | 1.9s | |
21 +| Anthropic | `claude-opus-4-8` | chat | ✅ | 2.8s | |
22 +| Anthropic | `claude-opus-5` | chat | ✅ | 2.4s | |
23 +| Anthropic | `claude-opus-5` | stream | ✅ | 2.2s | deltas=2 usage=true |
24 +| Anthropic | `claude-opus-5` | vision | ✅ | 2.6s | Red |
25 +| Anthropic | `claude-sonnet-4-5-20250929` | chat | ✅ | 1.6s | |
26 +| Anthropic | `claude-sonnet-4-6` | chat | ✅ | 1.3s | |
27 +| Anthropic | `claude-sonnet-5` | chat | ✅ | 1.3s | |
28 +| Cerebras | `—` | models | ✅ | 0.2s | 3 live |
29 +| Cerebras | `gemma-4-31b` | chat | ✅ | 0.3s | |
30 +| Cerebras | `gemma-4-31b` | vision | ✅ | 0.3s | Red |
31 +| Cerebras | `gpt-oss-120b` | chat | ✅ | 0.1s | |
32 +| Cerebras | `gpt-oss-120b` | stream | ✅ | 0.1s | deltas=1 usage=true |
33 +| Cerebras | `zai-glm-4.7` | chat | ✅ | 0.2s | |
34 +| DeepInfra | `—` | models | ✅ | 0.6s | 174 live |
35 +| DeepInfra | `MiniMaxAI/MiniMax-M3` | chat | ✅ | 1.0s | |
36 +| DeepInfra | `Qwen/Qwen3-235B-A22B-Instruct-2507` | chat | ✅ | 0.3s | |
37 +| DeepInfra | `Qwen/Qwen3-235B-A22B-Thinking-2507` | chat | ✅ | 1.0s | |
38 +| DeepInfra | `Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo` | chat | ✅ | 0.3s | |
39 +| DeepInfra | `Qwen/Qwen3-VL-235B-A22B-Instruct` | chat | ✅ | 0.3s | |
40 +| DeepInfra | `Qwen/Qwen3.5-397B-A17B` | chat | ✅ | 3.3s | |
41 +| DeepInfra | `Qwen/Qwen3.7-Max` | chat | ✅ | 5.7s | |
42 +| DeepInfra | `anthropic/claude-fable-5` | chat | ✅ | 2.3s | |
43 +| DeepInfra | `anthropic/claude-fable-5` | stream | ✅ | 1.7s | deltas=4 usage=true |
44 +| DeepInfra | `anthropic/claude-fable-5` | vision | ✅ | 1.8s | Red |
45 +| DeepInfra | `anthropic/claude-haiku-4-5` | chat | ✅ | 0.9s | |
46 +| DeepInfra | `anthropic/claude-opus-4-8` | chat | ✅ | 1.9s | |
47 +| DeepInfra | `anthropic/claude-opus-5` | chat | ✅ | 1.7s | |
48 +| DeepInfra | `anthropic/claude-sonnet-5` | chat | ✅ | 1.5s | |
49 +| DeepInfra | `deepseek-ai/DeepSeek-R1-0528` | chat | ✅ | 1.5s | |
50 +| DeepInfra | `deepseek-ai/DeepSeek-V3.1` | chat | ✅ | 0.4s | |
51 +| DeepInfra | `deepseek-ai/DeepSeek-V4-Flash` | chat | ✅ | 1.4s | |
52 +| DeepInfra | `deepseek-ai/DeepSeek-V4-Pro` | chat | ✅ | 0.4s | |
53 +| DeepInfra | `google/gemini-2.5-flash` | chat | ✅ | 1.3s | |
54 +| DeepInfra | `google/gemini-2.5-pro` | chat | ✅ | 5.8s | |
55 +| DeepInfra | `google/gemini-3.1-flash-lite` | chat | ✅ | 1.2s | |
56 +| DeepInfra | `google/gemini-3.1-pro` | chat | ✅ | 3.9s | |
57 +| DeepInfra | `google/gemini-3.5-flash` | chat | ✅ | 2.3s | |
58 +| DeepInfra | `google/gemma-4-31B-it` | chat | ❌ | 121.0s | Network error: The request timed out. |
59 +| DeepInfra | `meta-llama/Llama-3.3-70B-Instruct-Turbo` | chat | ✅ | 0.8s | |
60 +| DeepInfra | `meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8` | chat | ✅ | 0.3s | |
61 +| DeepInfra | `meta-llama/Llama-4-Scout-17B-16E-Instruct` | chat | ✅ | 0.3s | |
62 +| DeepInfra | `meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo` | chat | ✅ | 0.3s | |
63 +| DeepInfra | `mistralai/Mistral-Small-3.2-24B-Instruct-2506` | chat | ✅ | 1.2s | |
64 +| DeepInfra | `moonshotai/Kimi-K2.5` | chat | ✅ | 3.1s | |
65 +| DeepInfra | `moonshotai/Kimi-K2.6` | chat | ✅ | 2.8s | |
66 +| DeepInfra | `moonshotai/Kimi-K2.7-Code` | chat | ✅ | 0.7s | |
67 +| DeepInfra | `nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B` | chat | ✅ | 0.5s | |
68 +| DeepInfra | `openai/gpt-oss-120b` | chat | ✅ | 1.2s | |
69 +| DeepInfra | `openai/gpt-oss-20b` | chat | ✅ | 0.4s | |
70 +| DeepInfra | `zai-org/GLM-4.7` | chat | ✅ | 2.5s | |
71 +| DeepInfra | `zai-org/GLM-5.2` | chat | ✅ | 1.4s | |
14 72 | DeepSeek | `—` | models | ✅ | 0.4s | 2 live |
15 | DeepSeek | `deepseek-v4-flash` | chat | ✅ | 1.1s | |
16 | DeepSeek | `deepseek-v4-flash` | stream | ✅ | 0.9s | deltas=9 usage=true |
73 +| DeepSeek | `deepseek-v4-flash` | chat | ✅ | 0.9s | |
74 +| DeepSeek | `deepseek-v4-flash` | stream | ✅ | 1.3s | deltas=9 usage=true |
75 +| DeepSeek | `deepseek-v4-pro` | chat | ✅ | 1.3s | |
76 +| Google Gemini | `—` | models | ✅ | 0.3s | 57 live |
77 +| Google Gemini | `gemini-2.5-flash` | chat | ✅ | 0.5s | |
78 +| Google Gemini | `gemini-2.5-flash-lite` | chat | ✅ | 0.4s | |
79 +| Google Gemini | `gemini-2.5-pro` | chat | ✅ | 2.0s | |
80 +| Google Gemini | `gemini-3-flash-preview` | chat | ✅ | 0.9s | |
81 +| Google Gemini | `gemini-3.1-flash-lite` | chat | ✅ | 0.7s | |
82 +| Google Gemini | `gemini-3.1-pro-preview` | chat | ✅ | 2.8s | |
83 +| Google Gemini | `gemini-3.5-flash` | chat | ✅ | 1.3s | |
84 +| Google Gemini | `gemini-3.5-flash-lite` | chat | ✅ | 1.0s | |
85 +| Google Gemini | `gemini-3.6-flash` | chat | ✅ | 1.0s | |
86 +| Google Gemini | `gemini-3.6-flash` | stream | ✅ | 1.3s | deltas=1 usage=true |
87 +| Google Gemini | `gemini-3.6-flash` | vision | ✅ | 1.4s | Red |
88 +| Google Gemini | `gemini-flash-latest` | chat | ✅ | 1.2s | |
89 +| Google Gemini | `gemini-flash-lite-latest` | chat | ✅ | 0.6s | |
90 +| Google Gemini | `gemini-pro-latest` | chat | ✅ | 2.2s | |
91 +| Google Gemini | `gemma-4-26b-a4b-it` | chat | ✅ | 1.8s | |
92 +| Google Gemini | `gemma-4-31b-it` | chat | ✅ | 1.4s | |
93 +| Kimi | `—` | models | ✅ | 0.7s | 12 live |
94 +| Kimi | `kimi-k2.5` | chat | ✅ | 3.8s | |
95 +| Kimi | `kimi-k2.6` | chat | ✅ | 2.5s | |
96 +| Kimi | `kimi-k2.7-code` | chat | ✅ | 1.1s | |
97 +| Kimi | `kimi-k2.7-code-highspeed` | chat | ✅ | 0.8s | |
98 +| Kimi | `kimi-k3` | chat | ✅ | 7.2s | |
99 +| Kimi | `kimi-k3` | stream | ✅ | 2.9s | deltas=9 usage=true |
100 +| Kimi | `kimi-k3` | vision | ✅ | 13.1s | Red |
101 +| Kimi | `moonshot-v1-128k` | chat | ✅ | 0.5s | |
102 +| Kimi | `moonshot-v1-128k-vision-preview` | chat | ✅ | 0.5s | |
103 +| Kimi | `moonshot-v1-32k` | chat | ✅ | 0.5s | |
104 +| Kimi | `moonshot-v1-32k-vision-preview` | chat | ✅ | 0.5s | |
105 +| Kimi | `moonshot-v1-8k` | chat | ✅ | 0.5s | |
106 +| Kimi | `moonshot-v1-8k-vision-preview` | chat | ✅ | 0.6s | |
107 +| Kimi | `moonshot-v1-auto` | chat | ✅ | 0.7s | |
108 +| Mistral | `—` | models | ✅ | 0.4s | 60 live |
109 +| Mistral | `codestral-latest` | chat | ✅ | 0.3s | |
110 +| Mistral | `devstral-latest` | chat | ✅ | 0.4s | |
111 +| Mistral | `magistral-medium-latest` | chat | ✅ | 0.9s | |
112 +| Mistral | `ministral-14b-latest` | chat | ✅ | 0.3s | |
113 +| Mistral | `ministral-3b-latest` | chat | ✅ | 0.3s | |
114 +| Mistral | `ministral-8b-latest` | chat | ✅ | 0.3s | |
115 +| Mistral | `mistral-large-latest` | chat | ✅ | 2.3s | |
116 +| Mistral | `mistral-medium-latest` | chat | ✅ | 0.4s | |
117 +| Mistral | `mistral-medium-latest` | stream | ✅ | 0.8s | deltas=9 usage=true |
118 +| Mistral | `mistral-medium-latest` | vision | ✅ | 1.4s | The image is a solid red color. Therefor |
119 +| Mistral | `mistral-small-latest` | chat | ✅ | 0.7s | |
120 +| Mistral | `open-mistral-nemo` | chat | ✅ | 0.6s | |
121 +| OpenAI | `—` | models | ✅ | 1.1s | 132 live |
122 +| OpenAI | `chat-latest` | chat | ✅ | 1.1s | |
123 +| OpenAI | `gpt-3.5-turbo` | chat | ✅ | 1.2s | |
124 +| OpenAI | `gpt-4` | chat | ✅ | 1.1s | |
125 +| OpenAI | `gpt-4-turbo` | chat | ✅ | 1.8s | |
126 +| OpenAI | `gpt-4.1` | chat | ✅ | 0.8s | |
127 +| OpenAI | `gpt-4.1-mini` | chat | ✅ | 1.2s | |
128 +| OpenAI | `gpt-4.1-nano` | chat | ✅ | 0.4s | |
129 +| OpenAI | `gpt-4o` | chat | ✅ | 0.4s | |
130 +| OpenAI | `gpt-4o-mini` | chat | ✅ | 0.5s | |
131 +| OpenAI | `gpt-5` | chat | ✅ | 1.9s | |
132 +| OpenAI | `gpt-5-mini` | chat | ✅ | 1.2s | |
133 +| OpenAI | `gpt-5-nano` | chat | ✅ | 0.9s | |
134 +| OpenAI | `gpt-5.1` | chat | ✅ | 0.8s | |
135 +| OpenAI | `gpt-5.2` | chat | ✅ | 0.9s | |
136 +| OpenAI | `gpt-5.2-chat-latest` | chat | ✅ | 1.3s | |
137 +| OpenAI | `gpt-5.3-chat-latest` | chat | ❌ | 2.2s | empty response |
138 +| OpenAI | `gpt-5.4` | chat | ✅ | 0.8s | |
139 +| OpenAI | `gpt-5.4-mini` | chat | ✅ | 0.8s | |
140 +| OpenAI | `gpt-5.4-nano` | chat | ✅ | 0.7s | |
141 +| OpenAI | `gpt-5.5` | chat | ✅ | 1.2s | |
142 +| OpenAI | `gpt-5.6-luna` | chat | ✅ | 2.0s | |
143 +| OpenAI | `gpt-5.6-sol` | chat | ✅ | 2.0s | |
144 +| OpenAI | `gpt-5.6-sol` | stream | ✅ | 1.2s | deltas=9 usage=true |
145 +| OpenAI | `gpt-5.6-sol` | vision | ✅ | 1.1s | Red |
146 +| OpenAI | `gpt-5.6-terra` | chat | ✅ | 4.6s | |
147 +| OpenAI | `o1` | chat | ✅ | 1.5s | |
148 +| OpenAI | `o3` | chat | ✅ | 0.9s | |
149 +| OpenAI | `o3-mini` | chat | ✅ | 1.5s | |
150 +| OpenAI | `o4-mini` | chat | ✅ | 1.0s | |
151 +| Perplexity | `sonar` | chat | ✅ | 1.7s | |
152 +| Perplexity | `sonar` | stream | ✅ | 2.1s | deltas=9 usage=true |
153 +| Perplexity | `sonar-deep-research` | chat | ✅ | — | SKIPPED: multi-minute agentic research runs; verified via docs only |
154 +| Perplexity | `sonar-pro` | chat | ✅ | 2.5s | |
155 +| Perplexity | `sonar-reasoning-pro` | chat | ✅ | 3.5s | |
156 +| Alibaba Qwen | `—` | models | ✅ | 1.0s | 151 live |
157 +| Alibaba Qwen | `deepseek-v4-flash` | chat | ✅ | 1.4s | |
158 +| Alibaba Qwen | `deepseek-v4-pro` | chat | ✅ | 1.6s | |
159 +| Alibaba Qwen | `glm-5.2` | chat | ✅ | 1.8s | |
160 +| Alibaba Qwen | `kimi-k2.7-code` | chat | ✅ | 1.5s | |
161 +| Alibaba Qwen | `qvq-max` | chat | ✅ | 2.3s | |
162 +| Alibaba Qwen | `qwen-flash` | chat | ✅ | 0.4s | |
163 +| Alibaba Qwen | `qwen-max` | chat | ✅ | 0.6s | |
164 +| Alibaba Qwen | `qwen-plus` | chat | ✅ | 0.7s | |
165 +| Alibaba Qwen | `qwen-turbo` | chat | ✅ | 0.5s | |
166 +| Alibaba Qwen | `qwen3-235b-a22b-instruct-2507` | chat | ✅ | 0.6s | |
167 +| Alibaba Qwen | `qwen3-235b-a22b-thinking-2507` | chat | ✅ | 1.0s | |
168 +| Alibaba Qwen | `qwen3-coder-480b-a35b-instruct` | chat | ✅ | 0.9s | |
169 +| Alibaba Qwen | `qwen3-coder-flash` | chat | ✅ | 0.7s | |
170 +| Alibaba Qwen | `qwen3-coder-next` | chat | ✅ | 0.8s | |
171 +| Alibaba Qwen | `qwen3-coder-plus` | chat | ✅ | 0.8s | |
172 +| Alibaba Qwen | `qwen3-next-80b-a3b-instruct` | chat | ✅ | 0.5s | |
173 +| Alibaba Qwen | `qwen3-next-80b-a3b-thinking` | chat | ✅ | 1.1s | |
174 +| Alibaba Qwen | `qwen3-vl-235b-a22b-instruct` | chat | ✅ | 0.5s | |
175 +| Alibaba Qwen | `qwen3-vl-235b-a22b-thinking` | chat | ✅ | 6.2s | |
176 +| Alibaba Qwen | `qwen3-vl-flash` | chat | ✅ | 0.7s | |
177 +| Alibaba Qwen | `qwen3-vl-plus` | chat | ✅ | 1.0s | |
178 +| Alibaba Qwen | `qwen3.5-122b-a10b` | chat | ✅ | 1.3s | |
179 +| Alibaba Qwen | `qwen3.5-35b-a3b` | chat | ✅ | 1.5s | |
180 +| Alibaba Qwen | `qwen3.5-397b-a17b` | chat | ✅ | 6.1s | |
181 +| Alibaba Qwen | `qwen3.5-flash` | chat | ✅ | 1.8s | |
182 +| Alibaba Qwen | `qwen3.5-plus` | chat | ✅ | 7.1s | |
183 +| Alibaba Qwen | `qwen3.6-flash` | chat | ✅ | 2.2s | |
184 +| Alibaba Qwen | `qwen3.6-plus` | chat | ✅ | 3.0s | |
185 +| Alibaba Qwen | `qwen3.7-flash` | chat | ✅ | 2.1s | |
186 +| Alibaba Qwen | `qwen3.7-max` | chat | ✅ | 4.9s | |
187 +| Alibaba Qwen | `qwen3.7-max` | stream | ✅ | 3.8s | deltas=3 usage=true |
188 +| Alibaba Qwen | `qwen3.7-plus` | chat | ✅ | 4.3s | |
189 +| Alibaba Qwen | `qwen3.7-plus` | vision | ✅ | 3.2s | Red |
190 +| Alibaba Qwen | `qwq-plus` | chat | ✅ | 3.9s | |
191 +| Together AI | `—` | models | ✅ | 0.4s | 270 live |
192 +| Together AI | `MiniMaxAI/MiniMax-M3` | chat | ✅ | 0.6s | |
193 +| Together AI | `Qwen/Qwen3.5-9B` | chat | ❌ | 1.1s | empty response |
194 +| Together AI | `Qwen/Qwen3.6-Plus` | chat | ✅ | 4.6s | |
195 +| Together AI | `Qwen/Qwen3.7-Max` | chat | ✅ | 4.1s | |
196 +| Together AI | `Qwen/Qwen3.7-Plus` | chat | ✅ | 4.5s | |
197 +| Together AI | `deepseek-ai/DeepSeek-V4-Pro` | chat | ✅ | 1.4s | |
198 +| Together AI | `google/gemma-4-31B-it` | chat | ❌ | 121.0s | Network error: The request timed out. |
199 +| Together AI | `google/gemma-4-31B-it` | vision | ❌ | 0.7s | empty response |
200 +| Together AI | `meta-llama/Llama-3.3-70B-Instruct-Turbo` | chat | ✅ | 2.5s | |
201 +| Together AI | `moonshotai/Kimi-K2.6` | chat | ✅ | 1.3s | |
202 +| Together AI | `moonshotai/Kimi-K2.7-Code` | chat | ✅ | 1.2s | |
203 +| Together AI | `moonshotai/Kimi-K3` | chat | ✅ | 6.8s | |
204 +| Together AI | `moonshotai/Kimi-K3` | stream | ✅ | 2.6s | deltas=2 usage=true |
205 +| Together AI | `nvidia/nemotron-3-ultra-550b-a55b` | chat | ✅ | 0.4s | |
206 +| Together AI | `openai/gpt-oss-120b` | chat | ✅ | 0.5s | |
207 +| Together AI | `openai/gpt-oss-20b` | chat | ✅ | 0.3s | |
208 +| Together AI | `thinkingmachines/Inkling` | chat | ✅ | 0.5s | |
209 +| Together AI | `zai-org/GLM-5.2` | chat | ✅ | 0.9s | |
210 +| xAI | `—` | models | ✅ | 0.3s | 10 live |
211 +| xAI | `grok-4.20` | chat | ✅ | 1.2s | |
212 +| xAI | `grok-4.20-non-reasoning` | chat | ✅ | 0.4s | |
213 +| xAI | `grok-4.3` | chat | ✅ | 1.6s | |
214 +| xAI | `grok-4.5` | chat | ✅ | 0.7s | |
215 +| xAI | `grok-4.5` | stream | ✅ | 0.9s | deltas=9 usage=true |
216 +| xAI | `grok-4.5` | vision | ✅ | 1.1s | Red |
217 +| xAI | `grok-code-fast-1` | chat | ✅ | 2.1s | |
17 218