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%
4.2 KB

# Live API probes — 2026-07-30 (real keys, ground truth)

All 12 providers were probed live today. Every key authenticated and every provider returned a successful streamed chat completion (HTTP 200). Raw captures in /tmp/zyquo-probe/ (models JSON

  • sse/*.txt).

# /models listing results

Provider Endpoint Result
OpenAI GET https://api.openai.com/v1/models (Bearer) 200 — 132 models
Anthropic GET https://api.anthropic.com/v1/models?limit=100 (x-api-key + anthropic-version) 200 — 11 models
xAI GET https://api.x.ai/v1/models (Bearer) 200 — 10 models
Mistral GET https://api.mistral.ai/v1/models (Bearer) 200 — 60 models
Gemini GET https://generativelanguage.googleapis.com/v1beta/models?key=… 200 — 41 generateContent-capable
Qwen/DashScope GET https://dashscope-intl.aliyuncs.com/compatible-mode/v1/models (Bearer) 200 — 151 models
DeepSeek GET https://api.deepseek.com/models (Bearer) 200 — 2 models: deepseek-v4-flash, deepseek-v4-pro
Kimi/Moonshot GET https://api.moonshot.ai/v1/models (Bearer) 200 — 12 models (kimi-k2.5/k2.6/k2.7-code[-highspeed]/k3, moonshot-v1 family)
Perplexity GET https://api.perplexity.ai/models 404 — no models endpoint (catalog must be built-in from docs)
Together GET https://api.together.xyz/v1/models (Bearer) 200 — large catalog (~400KB JSON, embeds context_length + pricing)
DeepInfra GET https://api.deepinfra.com/v1/openai/models (Bearer) 200 — 174 models
Cerebras GET https://api.cerebras.ai/v1/models (Bearer) 200 — 3 models: gemma-4-31b, gpt-oss-120b, zai-glm-4.7

# Streaming chat completion smoke test (all HTTP 200)

Model used per provider: OpenAI gpt-4o-mini, Anthropic claude-haiku-4-5-20251001, xAI grok-4.3, Mistral mistral-small-latest, Gemini-compat gemini-flash-latest, Qwen qwen-flash, DeepSeek deepseek-v4-flash, Kimi kimi-k2.5, Perplexity sonar, Together meta-llama/Llama-3.3-70B-Instruct-Turbo, DeepInfra deepseek-ai/DeepSeek-V4-Flash, Cerebras gpt-oss-120b.

# SSE shape observations (captured live)

  • OpenAI: chat.completion.chunk deltas; with stream_options:{include_usage:true} the final pre-[DONE] chunk has empty choices and a full usage object (incl. completion_tokens_details.reasoning_tokens). Chunks carry an obfuscation padding field — ignore unknown fields when decoding.
  • Anthropic: named SSE events observed: message_start, content_block_start, content_block_delta, content_block_stop, message_delta, message_stop, plus ping events.
  • DeepSeek: deepseek-v4-flash emits delta.reasoning_content string deltas by default (22 reasoning deltas before the answer in a trivial prompt), then delta.content. Both fields present on every delta (one is null).
  • Perplexity: chunks include citations (array of URLs) and search_results alongside choices and usage; each chunk also duplicates a cumulative message next to delta.
  • Gemini (OpenAI-compat endpoint): works with Bearer auth; deltas can include extra_content.google.thought_signature (opaque base64) — must be tolerated/ignored; finish_reason:"length" seen when max_tokens hit mid-thought.
  • Qwen (compat-mode intl): standard OpenAI chunk shape; usage null until final chunk.
  • Kimi, Mistral, xAI, Together, DeepInfra, Cerebras: standard OpenAI-style chunks, data: [DONE] terminator.

# Consequences for the app

  1. deepseek-v4-flash / v4-pro replace the old deepseek-chat / deepseek-reasoner aliases in the catalog (verify alias behavior in Phase 7 — the old aliases may still route).
  2. Perplexity requires a fully built-in catalog (no dynamic refresh).
  3. Cerebras /models returns fewer models than docs may list — treat docs as the catalog source, /models as availability check.
  4. JSON decoders must ignore unknown fields everywhere (OpenAI obfuscation, Gemini extra_content, Perplexity extras).
  5. Reasoning-delta handling needed for: DeepSeek (reasoning_content), Qwen thinking models, Anthropic (thinking_delta), Gemini (thought signatures).