SPB Git

spb/zyquo-agent Public MIT

The autonomous agent that actually operates your Mac — plans, runs real commands, verifies its own work.

Swift 94.7% Shell 4.1% Python 0.7% Makefile 0.5%
5.7 KB · 165 lines swift
Raw Blame History
1//2//  AgentModelSupport.swift3//  Zyquo Agent4//5//  Author: Simon-Pierre Boucher6//  Mail: contact@spboucher.ai7//8//  The agent-capable subset of the shared Zyquo Cloud catalog, exactly as9//  documented in docs/PROVIDER-REUSE.md §3: models with live-verified native10//  function calling, frontier-tier multi-step reasoning, and ≥ ~128K context.11//  Everything else stays in the picker (same list as Cloud) but is12//  de-emphasized; models with `capabilities.tools == false` (Perplexity sonar,13//  Gemma, QVQ, DeepSeek R1 distills…) are hard-excluded — the agent loop14//  refuses to start with them.15//1617import Foundation1819enum AgentModelSupport {20    /// Curated "provider|modelID" keys of the agent-capable subset21    /// (the 🤖 marks in docs/PROVIDER-REUSE.md §2).22    static let capableKeys: Set<String> = [23        // OpenAI24        "openai|gpt-5.6-sol",25        "openai|gpt-5.6-terra",26        "openai|gpt-5.6-luna",27        "openai|gpt-5.5",28        "openai|gpt-5.4",29        "openai|gpt-5.4-mini",30        "openai|gpt-5.2",31        "openai|gpt-5.1",32        "openai|gpt-5",33        "openai|gpt-5-mini",34        "openai|o3",35        "openai|o4-mini",36        // Anthropic37        "anthropic|claude-opus-5",38        "anthropic|claude-sonnet-5",39        "anthropic|claude-fable-5",40        "anthropic|claude-opus-4-8",41        "anthropic|claude-opus-4-7",42        "anthropic|claude-opus-4-6",43        "anthropic|claude-sonnet-4-6",44        "anthropic|claude-haiku-4-5-20251001",45        // xAI46        "xai|grok-4.5",47        "xai|grok-4.3",48        "xai|grok-4.20",49        "xai|grok-4.20-non-reasoning",50        "xai|grok-code-fast-1",51        // Mistral52        "mistral|mistral-medium-latest",53        "mistral|mistral-large-latest",54        "mistral|mistral-small-latest",55        // Google Gemini (compat endpoint)56        "gemini|gemini-3.6-flash",57        "gemini|gemini-3.5-flash",58        "gemini|gemini-3.5-flash-lite",59        "gemini|gemini-3.1-pro-preview",60        "gemini|gemini-2.5-pro",61        "gemini|gemini-2.5-flash",62        "gemini|gemini-pro-latest",63        "gemini|gemini-flash-latest",64        // Alibaba Qwen / DashScope65        "qwen|qwen3.7-max",66        "qwen|qwen3.7-plus",67        "qwen|qwen3.7-flash",68        "qwen|qwen3.6-plus",69        "qwen|qwen3.5-plus",70        "qwen|qwen3-coder-plus",71        "qwen|qwen3-coder-flash",72        "qwen|qwen3-coder-next",73        "qwen|qwen3-coder-480b-a35b-instruct",74        "qwen|qwen3.5-397b-a17b",75        "qwen|deepseek-v4-pro",76        "qwen|glm-5.2",77        // DeepSeek78        "deepseek|deepseek-v4-flash",79        "deepseek|deepseek-v4-pro",80        // Kimi / Moonshot81        "kimi|kimi-k3",82        "kimi|kimi-k2.7-code",83        "kimi|kimi-k2.7-code-highspeed",84        "kimi|kimi-k2.6",85        "kimi|kimi-k2.5",86        // Together AI87        "together|moonshotai/Kimi-K3",88        "together|moonshotai/Kimi-K2.7-Code",89        "together|deepseek-ai/DeepSeek-V4-Pro",90        "together|zai-org/GLM-5.2",91        "together|Qwen/Qwen3.7-Max",92        "together|openai/gpt-oss-120b",93        "together|nvidia/nemotron-3-ultra-550b-a55b",94        "together|MiniMaxAI/MiniMax-M3",95        // DeepInfra96        "deepinfra|anthropic/claude-fable-5",97        "deepinfra|anthropic/claude-opus-5",98        "deepinfra|anthropic/claude-sonnet-5",99        "deepinfra|anthropic/claude-opus-4-8",100        "deepinfra|anthropic/claude-haiku-4-5",101        "deepinfra|google/gemini-3.1-pro",102        "deepinfra|google/gemini-3.5-flash",103        "deepinfra|deepseek-ai/DeepSeek-V4-Pro",104        "deepinfra|deepseek-ai/DeepSeek-V4-Flash",105        "deepinfra|moonshotai/Kimi-K2.7-Code",106        "deepinfra|zai-org/GLM-5.2",107        "deepinfra|Qwen/Qwen3.7-Max",108        "deepinfra|Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo",109        "deepinfra|openai/gpt-oss-120b",110        "deepinfra|MiniMaxAI/MiniMax-M3",111        // Cerebras112        "cerebras|gpt-oss-120b",113        "cerebras|gemma-4-31b",114    ]115116    /// Overall default agent model (docs/PROVIDER-REUSE.md §3):117    /// Claude Sonnet 5 — 1M context, adaptive thinking, best-in-class tool use.118    static let defaultModelID = "claude-sonnet-5"119    static let defaultModelProvider = ProviderID.anthropic120121    /// Suggested per-provider agent defaults (bolded 🤖 entries in §2).122    static let providerDefaults: [ProviderID: String] = [123        .openai: "gpt-5.6-terra",124        .anthropic: "claude-sonnet-5",125        .xai: "grok-4.5",126        .mistral: "mistral-medium-latest",127        .gemini: "gemini-3.6-flash",128        .qwen: "qwen3.7-max",129        .deepseek: "deepseek-v4-pro",130        .kimi: "kimi-k3",131        .together: "deepseek-ai/DeepSeek-V4-Pro",132        .deepinfra: "deepseek-ai/DeepSeek-V4-Pro",133        .cerebras: "gpt-oss-120b",134    ]135136    /// Recommended top tier, surfaced first in the model chip (§3).137    static let recommendedKeys: [String] = [138        "anthropic|claude-sonnet-5",139        "anthropic|claude-opus-5",140        "openai|gpt-5.6-terra",141        "openai|gpt-5.6-sol",142        "gemini|gemini-3.6-flash",143        "xai|grok-4.5",144        "xai|grok-code-fast-1",145        "deepseek|deepseek-v4-pro",146        "kimi|kimi-k3",147        "kimi|kimi-k2.7-code",148        "qwen|qwen3.7-max",149        "mistral|mistral-medium-latest",150        "cerebras|gpt-oss-120b",151    ]152}153154extension AIModel {155    /// Whether this model is suitable for deep agentic, multi-step tool use.156    /// Built-ins follow the curated subset; user-defined custom models qualify157    /// whenever they declare tool support. `capabilities.tools == false` is158    /// always disqualifying (hard exclusion).159    var agentCapable: Bool {160        guard capabilities.tools, !isLegacy else { return false }161        if provider == .custom { return true }162        return AgentModelSupport.capableKeys.contains("\(provider.rawValue)|\(id)")163    }164}165