diff --git a/docs/README.md b/docs/README.md index de0ed4a61d..3959949089 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # DeepChat 文档索引 -本文档反映 `2026-07-30` 的当前代码。历史实施过程、已完成 issue 和一次性 SDD 通过 Git +本文档反映 `2026-08-05` 的当前代码。历史实施过程、已完成 issue 和一次性 SDD 通过 Git 历史查询,不再长期留在 `docs/`。 ## 当前必读 @@ -16,6 +16,7 @@ | [architecture/tape-system.md](./architecture/tape-system.md) | Tape、ViewManifest、回放和 Subagent lineage | | [architecture/event-system.md](./architecture/event-system.md) | typed route、typed event 和 main 内部调用规则 | | [guides/getting-started.md](./guides/getting-started.md) | 当前代码入口和本地开发命令 | +| [guides/cli.md](./guides/cli.md) | 随包 CLI 的能力、生命周期、安全边界和 benchmark 合同 | | [guides/plugin-packaging.md](./guides/plugin-packaging.md) | `.dcplugin` 打包、内置分发和 release 规则 | | [release-flow.md](./release-flow.md) | 版本、分支、tag 和平台构建流程 | | [spec-driven-dev.md](./spec-driven-dev.md) | SDD 分类、产物和清理规则 | @@ -26,6 +27,7 @@ | 文档 | 状态 | | --- | --- | +| [architecture/local-control-plane/](./architecture/local-control-plane/) | CLI V1 已实现;全量测试与生产构建通过,当前平台 unpack 受发布 runtime 下载网络阻塞 | | [features/acp-v1-reliability/](./features/acp-v1-reliability/) | ACP capability、auth、session lifecycle 与 diagnostics 待实施 | | [features/cua-cross-platform-computer-use/](./features/cua-cross-platform-computer-use/) | 已实现主体,等待 CI platform matrix 验证 | | [features/mcp-oauth-authentication/](./features/mcp-oauth-authentication/) | 已实现主体,等待真实 OAuth smoke | diff --git a/docs/architecture/local-control-plane/plan.md b/docs/architecture/local-control-plane/plan.md new file mode 100644 index 0000000000..c65044d568 --- /dev/null +++ b/docs/architecture/local-control-plane/plan.md @@ -0,0 +1,127 @@ +# Local Control Plane and Bundled CLI V1 Plan + +## Delivery Rules + +- Implement the complete V1 on `feat/local-control-plane-cli-v1` as dependency-ordered commits. +- Before every commit, inspect the complete diff and affected call paths. Rank findings by severity + across hidden side effects, compatibility, boundaries, performance, security, naming, test + sufficiency, and maintenance cost; fix in-scope findings before committing. +- Commit messages describe delivered behavior and never describe the review process. +- Do not push from this workstream. +- Keep the surface deny-by-default and reuse canonical route contracts. + +## Stage A: Typed Foundation and Local Transport + +1. Introduce the discriminated `RouteCaller` wrapper and migrate the ten renderer-context integration + files without changing renderer behavior. +2. Add canonical contracts for CLI diagnostics, public DTOs, new compute routes, approval resolution, + artifacts, events, and detached runs. +3. Define `CLI_SURFACE_V1` with compile-time route references and runtime uniqueness/classification + assertions. +4. Implement descriptor creation, atomic permission-safe replacement, token rotation, stale cleanup, + UDS/named-pipe listening, authentication, JSON envelopes, body bounds, and shutdown fencing. +5. Implement the bundled Node thin client, two-token command grammar, descriptor discovery, + fail-closed Agent-token selection, version negotiation, machine output, cancellation, and stable + exit codes. +6. Add focused caller, surface, transport, descriptor, parser, and lifecycle tests. + +## Stage B: Raw Model, Media, Speech, OCR, and Artifacts + +1. Add `models.invoke` on the existing `coreStream` foundation with tools/session/memory disabled, + one canonical stream for all CLI output modes, explicit benchmark timings, and secret-safe + provider failure metadata. +2. Expose standalone image and video generation through typed contracts and output artifacts. +3. Add a provider-runtime `generateSpeechStandalone` capability and typed audio artifact; keep the + current VoiceAI event quirk behind its adapter. +4. Move transcription CLI input to bounded upload/owned-artifact adapters. +5. Add strict request-body accumulation limits, private threshold spill, and exhaustive cleanup. +6. Implement output-only `ArtifactSpool` ownership, quotas, streaming download, expiry, startup + cleanup, and shutdown cleanup. +7. Add OCR status, human upload extraction, owned-artifact extraction, and human-only cache clearing + at background priority with bounded text output. +8. Add machine metrics for raw/media/OCR benchmarks, including the four explicit OCR states. +9. Add focused provider, artifact, upload, OCR, quota, and CLI integration tests. + +## Stage C: Effects, Approval, and Administration + +1. Extract canonicalization and the generic pending/timeout/consume mechanics into `ApprovalBroker` + while preserving all existing tool permission behavior through `ToolPermissionBroker`. +2. Add `CliMutationGuard`, unique per-request CLI approvals, redacted display data, targeted approval + events, and renderer-only `approvals.resolve` typed IPC. +3. Implement the effect matrix, operation classifier, scope checks, audit records, rate limits, and + renderer-unavailable failure behavior. +4. Expose redacted settings and allowlisted updates with per-key effect classification. +5. Expose redacted provider/model reads and separated configuration/credential mutations. +6. Expose reviewed Skill list/enable/install/uninstall adapters without arbitrary Agent paths. +7. Expose reviewed MCP list/add/update/remove/enable/start/stop adapters without raw tool calls or + secret-bearing output. Agent access is limited to redacted list and a bounded, fully reviewable, + disabled HTTPS remote add; updates remain human-only because they can restart a running server. +8. Add policy-matrix, approval-state, redaction, compatibility, and administration tests. + +## Stage D: Typed Events and Detached Agent Runs + +1. Replace relevant all-window publication with a Typed Event Hub that supports explicit renderer, + connection, request, and run targets. +2. Add bounded subscriber queues, per-request ordering, overflow termination, disconnect handling, + and cursor/recovery semantics. +3. Add `sessions.runDetached` by composing existing detached session creation with an initial turn. +4. Add owned run status, message/result recovery, idempotent cancellation, and CLI JSONL streaming. +5. Prove that CLI prompt/delta/approval events cannot leak to unrelated windows or connections. +6. Add detached-run lifecycle, restart/recovery, cancellation, event isolation, and backpressure tests. + +## Stage E: Packaged Product and Agent Integration + +1. Build the CLI as a packaged application resource that runs on the bundled Node runtime. +2. Automatically reconcile platform launchers after server startup, with no settings toggle and with + explicit, reversible ownership that never overwrites foreign commands or shell content. Install a + stable regular-file shim, atomically refresh its pinned app-resource paths, migrate the owned + legacy POSIX symlink, and never fall back to a runtime from `PATH`. During full data reset, stop + the server first and treat owned-launcher removal as best-effort: conflicts or cleanup failures + preserve external files and cannot block application-data deletion. +3. Add the internal scoped-token issuer, conversation binding, expiry/revocation, call/byte quotas, + and main-enforced Agent restrictions. Derive each token's exact scopes from the shared command + catalog and `CLI_SURFACE`; the issuer has no broad default capability set. +4. Harden `CommandPermissionService` so redirection and compound shell syntax cannot inherit a safe + base-command decision. +5. Integrate `deepchat ` without adding `deepchat` to `SAFE_COMMANDS`; reject + prefix-global-flag grammar, deny Agent artifact-byte/output-path access, and make human-only + commands and wrapper processes fail closed without descriptor fallback. Keep `run watch` + human-only to avoid an Agent waiting on its own active run. +6. Prepend the packaged CLI directory to the controlled Agent shell `PATH` while retaining and + de-duplicating existing entries. +7. Add the bundled DeepChat CLI Skill and ensure instructions never expose the human descriptor. +8. Add packaged smoke coverage for diagnostics, raw text, artifact download, OCR, and scoped Agent + denial paths without requiring external credentials where fixtures can substitute providers. +9. Complete cross-platform packaging validation and user-facing documentation. + +## Validation Order + +Run the smallest relevant tests after each change, then expand by risk: + +```text +pnpm run format +pnpm run i18n +pnpm run lint +pnpm run typecheck +pnpm test +pnpm run build +``` + +Use current-platform unsigned packaging and packaged smoke where local prerequisites allow. Claims +for other targets require their normal platform workflows. Record actual commands and outcomes in +`tasks.md`; do not report an unrun check as passed. + +## Review Gates + +Before each commit, review staged and unstaged changes in this order: + +1. Critical: authority escalation, credential/output leakage, arbitrary file access/write, endpoint + exposure, approval replay, or data loss. +2. High: renderer compatibility, caller confusion, lifecycle races, unbounded memory/disk/event use, + cancellation gaps, or cross-request data leakage. +3. Medium: error/exit instability, incomplete cleanup, misleading naming, retry/idempotency ambiguity, + performance regression, or insufficient negative tests. +4. Low: maintainability, local duplication, documentation drift, and non-functional clarity. + +Resolve all in-scope findings, rerun affected checks, then commit with a behavior-specific +Conventional Commit subject of at most 50 characters. diff --git a/docs/architecture/local-control-plane/spec.md b/docs/architecture/local-control-plane/spec.md new file mode 100644 index 0000000000..66e3877bec --- /dev/null +++ b/docs/architecture/local-control-plane/spec.md @@ -0,0 +1,696 @@ +# Local Control Plane and Bundled CLI V1 + +Status: accepted; implementation in progress + +## Decision + +DeepChat main is the sole owner of the local control plane. A bundled Node CLI connects to the +running desktop application over HTTP semantics carried by a Unix domain socket on POSIX and a +named pipe on Windows. The CLI is a thin transport, formatting, and local file-I/O client. It does +not load providers, credentials, Skills, MCP servers, OCR runtimes, Agent runtimes, or application +databases. + +The public API is a versioned `CLI_SURFACE` allowlist that references DeepChat's canonical typed +route contracts. It is not a generic tunnel to the internal route registry. Raw model invocation, +media generation, offline OCR, and full detached Agent execution are separate capabilities with +separate policy and lifecycle semantics. + +Sensitive mutations use one main-owned approval state machine. The reusable state-machine core is +extracted from `ToolPermissionBroker`; the existing tool flow remains behind a tool-specific +adapter, while CLI mutations use `CliMutationGuard`. A CLI request may wait for a renderer decision, +but it can never approve itself or receive a replayable approval credential. + +The entire V1 is delivered on one feature branch through reviewable implementation commits. This +document intentionally describes dependency-ordered stages rather than repository integration +units. + +## Evidence Baseline + +This design is grounded in the current DeepChat tree and the separately inspected Alma 0.0.930 +application. Statements about Alma apply only to that inspected version. + +| Existing DeepChat component | Reused fact | +| --- | --- | +| `src/main/routes/routeRegistry.ts` | Main already owns a typed route registry and dispatcher. | +| `src/shared/contracts/routes.ts` | Route contracts are the canonical schema source. | +| `src/main/provider/index.ts` | `coreStream` plus standalone transcription, image, and video paths already exist. | +| `src/main/provider/providers/voiceAIProvider.ts` | Speech exists only as a stream-side implementation detail and needs a standalone contract. | +| `src/main/session/lifecycle.ts` | `createDetachedSession` creates a durable session without binding a renderer or starting a turn. | +| `src/main/app/composition.ts` | General events currently broadcast to every window and require targeted delivery for CLI requests. | +| `src/main/tool/permission/toolPermissionBroker.ts` | Canonical hashing, timeout, pending state, approval, and one-shot consumption already exist. | +| `src/main/tool/index.ts` | MCP and Agent pre-checks, including live delegation, already use the tool broker. | +| `src/main/tool/permission/commandPermissionService.ts` | Command approval is signature-based; `deepchat` must not become globally safe, and output redirection is currently missing from critical shell syntax. | +| `src/main/ocr/ocrRuntimeService.ts` | Image, batch, and document extraction are implemented; only an explicit public extraction contract is missing. | +| `src/main/ocr/ocrArtifactStore.ts` | Cache clearing removes derived cache rows only and rejects clearing while work is active. | + +Alma contributes useful product shape: a desktop-owned local service, a bundled command, and Agent +instructions that teach the command surface. Its inspected implementation is not adopted as a +protocol, schema, permission, or lifecycle foundation. + +## Goals + +- Ship `deepchat` with the desktop application and make it usable by humans, scripts, benchmark + harnesses, and explicitly scoped DeepChat Agents. +- Expose text, image, speech, transcription, video, OCR, and full Agent execution without moving + credentials or runtime ownership out of main. +- Expose a curated settings, provider/model, Skill, and MCP management plane with effects, + caller-specific policy, audit, and renderer-only approval. +- Provide deterministic JSON and JSONL output, stable exit codes, cancellation, timing, usage, and + artifact metadata suitable for external benchmarks. +- Reuse current route contracts, provider/session/OCR services, and permission machinery without a + second schema catalog or a second approval state machine. +- Preserve renderer behavior and compatibility while introducing an explicit caller model. + +## Non-Goals + +- TCP, HTTP loopback, remote access, CORS, or a network-listening daemon. +- A generic route-registry proxy or access to every internal route. +- CLI-side approval resolution or a `confirmed` request field. +- Raw MCP tool invocation, Browser/Computer Use, a TUI, or an interactive chat shell. +- Arbitrary settings, database, credential, filesystem, or application-secret reads. +- A persistent input-artifact lifecycle or arbitrary main-process input paths. +- Server-side OCR batch/layout/boxes/model management. +- A general cost-budget engine or an in-app benchmark framework. +- An ACP server. ACP remains a possible V2 transport over the same domain services. + +## Architectural Invariants + +1. Main is the only authority that resolves provider configuration, reads credentials, performs + upstream calls, mutates settings, installs Skills, manages MCP, runs OCR, and runs Agents. +2. Caller identity is constructed from the trusted transport. No request parameter can select or + upgrade its caller, scopes, connection, conversation, or approval state. +3. `CLI_SURFACE` is deny-by-default and independent from the internal route catalog. +4. Every exposed operation has an effect, caller set, scope predicate, rate/quota rule, audit rule, + transport shape, and output bound. +5. Approval resolution is renderer-only. The local socket exposes pending status, never resolve. +6. An approval is bound to the normalized method, arguments hash, main-generated execution identity, + scope, expiry, and original live request. It is consumed once and is never serializable as a + capability token. +7. Binary output is represented by an owned, expiring artifact. Main never writes a caller-supplied + output path. +8. Uploads are bounded independently of `Content-Length`; chunked bodies cannot bypass the limit. +9. Raw model invocation has no tools, memory, Skills, or session side effects. Full Agent execution + always uses the session runtime. +10. Agent callers cannot recursively start an Agent run. + +## Runtime Topology + +```mermaid +flowchart LR + Human["Human or benchmark"] --> CLI["Bundled deepchat CLI"] + Agent["DeepChat Agent shell"] --> Gate["CommandPermissionService"] + Gate --> CLI + CLI -->|"HTTP over UDS or named pipe"| Server["CliServer in main"] + Server --> Auth["Connection authentication and caller scopes"] + Auth --> Surface["Versioned CLI_SURFACE"] + Surface --> Policy["Effect policy and quotas"] + Policy --> Routes["Canonical typed routes and domain adapters"] + Policy --> Guard["CliMutationGuard"] + Guard --> Broker["ApprovalBroker core"] + Broker -->|"targeted event"| Renderer["Trusted renderer approval UI"] + Renderer -->|"typed IPC only"| Broker + Routes --> Providers["Provider runtime"] + Routes --> OCR["OCR runtime"] + Routes --> Sessions["Session and Agent runtime"] + Routes --> Admin["Settings, Skills, and MCP services"] + Providers --> Spool["ArtifactSpool"] + Sessions --> Events["Typed Event Hub"] + Spool --> CLI + Events --> CLI +``` + +`CliServer`, `ArtifactSpool`, and the CLI process are lifecycle clients of the existing main +composition. The server starts only after its route dependencies are ready. Shutdown first stops +accepting connections, aborts in-flight non-detached requests, closes event subscribers, cancels CLI +approval scopes, and removes the descriptor/socket; mutable services and databases close afterward. + +## Transport and Discovery + +### Endpoint + +- POSIX: an application-owned Unix domain socket below the DeepChat user-data directory. If that + would exceed the platform socket-path limit, main uses a deterministic per-user, per-profile + private runtime directory and keeps discovery in user data. After bind, socket type, ownership, + and `0600` mode are verified. +- Windows: a per-start random named-pipe name. The descriptor is protected with an owner-only ACL; + the random endpoint and bearer token provide defense in depth where Node does not expose a + portable pipe-DACL API. +- TCP fallback is forbidden. Failure to create the local endpoint disables CLI availability and is + reported by the desktop application; it never falls back to a port. + +The endpoint path/name is generated by main. Cleanup only touches the exact computed path after an +`lstat`/type check. It never deletes an environment-expanded, caller-provided, or broad path. + +### Descriptor + +Main atomically replaces a descriptor with this public shape: + +```ts +type LocalControlDescriptorV1 = { + protocolVersion: 1 + surfaceVersion: 1 + appVersion: string + endpoint: { kind: 'unix'; path: string } | { kind: 'pipe'; name: string } + pid: number + token: string + startedAt: number +} +``` + +The descriptor is `0600` on POSIX and owner-only on Windows. The token has at least 256 bits of +entropy, rotates on every main start, is compared in constant time, is never logged, and is removed +with the descriptor on clean shutdown. The CLI rejects malformed descriptors, unsupported versions, +impossible PIDs, non-local endpoint kinds, and overlong paths before connecting. A stale descriptor +is diagnostic information, not authority to launch or kill a process. + +The human descriptor token authenticates same-user local automation; it is not a defense against +arbitrary malware running as the same OS user. Agent invocation receives a short-lived scoped token +through the Agent runtime and must not rely on the descriptor token. The CLI must never fall back to +the human descriptor when an Agent-token environment is present but invalid, denied, exhausted, or +expired. A recognized direct `deepchat` command that is not Agent-accessible receives an explicitly +invalid Agent-token environment so it fails closed instead of changing principal. + +Every conversation-bound Agent shell process receives that fail-closed token environment by default, +including ordinary commands and wrapper processes. A catalog-approved direct CLI command replaces it +with a one-command capability token. Environment identity and command-rewrite control are separate: +ordinary commands may still use RTK rewriting, while an approved CLI command is preserved verbatim. + +The bearer token proves possession, not whether a same-UID process is semantically a human or an +Agent. A process that can read and deliberately replay the human descriptor can present as a human +caller. V1 therefore treats the Agent token as least-privilege capability routing, not process +attestation: sensitive operations still require renderer approval for a human token, `deepchat` +remains behind the shell gate, and the descriptor limitation is explicit. Stronger same-UID +separation would require an Agent sandbox or platform peer/process attestation and is not claimed by +this protocol. + +### HTTP Shapes + +- `POST /v1/rpc`: bounded JSON request and JSON response for unary methods. +- `POST /v1/stream`: bounded JSON request and `application/x-ndjson` response for streamed methods. +- `POST /v1/upload`: a strict typed-envelope header plus a bounded binary body for methods with byte + input. +- `GET /v1/artifacts/:id`: ownership-checked binary output download. +- `GET /v1/events`: ownership-checked NDJSON event subscription with request/run filters. + +All endpoints require `Authorization: Bearer`. RPC and stream requests also carry a singular +`X-DeepChat-Method` header. Main resolves that method's surface and byte limit before reading the +JSON body, then requires the typed envelope method to match the header. RPC envelopes carry a +caller-generated request ID, method, and params. Responses carry the same ID and either typed result +metadata or a stable error object. HTTP status communicates transport/authentication failure; CLI +exit codes communicate the domain outcome. Proxy environment variables are ignored for local +transport. + +`Content-Length` is rejected when missing for fixed JSON bodies, invalid, conflicting, or above the +route limit. Upload metadata is the normal RPC envelope encoded as canonical base64url in a singular, +4 KiB-bounded `X-DeepChat-Upload-Request` header. This lets main authenticate and validate version, +surface, caller, scopes, and typed metadata before accepting the large body. The body is raw +`application/octet-stream`; uploads with or without `Content-Length` enforce a cumulative route byte +limit while reading. The packaged client sends `Expect: 100-continue`; main sends `100 Continue` +only after authentication, surface checks, typed metadata validation, scope policy, and any renderer +approval complete. Rejection therefore does not read or persist the source bytes. Bodies spill to a +private `0700` directory above a route-specific memory threshold. Upload bytes always stream into a +private temporary file, so there is no multipart extraction pass or base64 expansion. Abort, parse +error, timeout, limit failure, and shutdown all remove partial files. The public protocol does not +expose those temporary paths. + +## Contract Ownership and Surface + +`CLI_SURFACE_V1` is a readonly registry whose entries reference the same `RouteContract` objects used +by renderer IPC. A surface entry adds only transport and policy metadata: + +```ts +type CliSurfaceEntry = { + contract: RouteContract + effect: + | CliEffect + | { possible: readonly CliEffect[]; resolve(input: unknown): CliEffect } + callers: readonly CliPrincipal[] + requiredScopes: readonly CliScope[] + transport: 'rpc' | 'stream' | 'upload' + approval: 'never' | 'policy' + limits: CliRouteLimits +} +``` + +Existing canonical contracts are reused when their input/output is safe. A genuinely new behavior or +redacted public view gets one new canonical shared contract and main handler; it is not described a +second time in a CLI-only schema. In particular, provider public DTOs exclude secrets, opaque auth +state, raw environment variables, and credential material. + +Public method names describe their domain (`models.invoke`, `providers.listPublic`, +`sessions.runDetached`). The `cli.*` namespace is reserved for behavior that exists only to operate +or diagnose the bundled CLI. + +### V1 Capability Matrix + +`H` means an authenticated human CLI connection. `A` means a short-lived Agent connection with the +listed scope. “Policy” means the renderer-only effect policy may be required; it never means a CLI +confirmation flag. + +| Capability | Public methods / command family | Effect | Callers | Approval | Output | +| --- | --- | --- | --- | --- | --- | +| 1. Raw text model | `models.listPublic`, `models.getCapabilities`, `models.invoke`; `deepchat model …` | read / compute | H, scoped A | never | JSON or token/usage JSONL | +| 2. Image generation | `images.generate`; `deepchat image generate` | compute | H, scoped A | never | progress JSONL + image artifacts | +| 3. Audio | `speech.generate`, `audio.transcribeUpload`, `audio.transcribeArtifact`; `deepchat audio speak\|transcribe` | compute | H; scoped A uses artifacts only | never | audio artifact or bounded text | +| 4. Video generation | `videos.generate`; `deepchat video generate` | compute | H, scoped A | never | progress JSONL + video artifact | +| 5. Offline OCR | `ocr.getRuntimeStatus`, `ocr.extractUpload`, `ocr.extractArtifact`, `ocr.clearCache`; `deepchat ocr …` | read / compute / local-maintenance | H; scoped A uses owned inputs and cannot clear | never | bounded text/metrics JSON | +| 6. Full Agent run | `sessions.runDetached`; `deepchat agent run` | compute | H only | never | durable run ID + targeted JSONL | +| 7. Settings | `settings.getPublic`, `settings.updatePublic`; `deepchat settings …` | read or key-derived mutation | H; scoped A for allowlisted keys | policy by effect | redacted JSON | +| 8. Provider/model administration | `providers.listPublic`, `providers.testPublicConnection`, `providers.addPublic`, `providers.updatePublic`, `providers.remove`, `providers.setCredential`, `models.listRuntime`, `models.setStatus`, `models.getPublicConfig`, `models.setPublicConfig`, `models.resetConfig`; `deepchat provider …`, `deepchat model config …` | read / execution-config / credential / destructive | H; A is read-only | policy for mutations | redacted JSON | +| 9. Skills | `skills.listPublic`, `skills.setPublicStatus`, `skills.installPublicUrl`, `skills.installUpload`, `skills.uninstallPublic`; `deepchat skill …` | read / execution-config / supply-chain / destructive | H; scoped A may request allowlisted mutations | policy for mutations | JSON | +| 10. MCP | `mcp.listPublic`, `mcp.addPublic`, `mcp.updatePublic`, `mcp.removePublic`, `mcp.setPublicStatus`, `mcp.startPublic`, `mcp.stopPublic`; `deepchat mcp …` | read / execution-config / security-config / supply-chain / credential / destructive | H; scoped A may list and request one reviewed disabled non-credential add | policy for mutations | redacted JSON/events | +| 11. Runs, events, artifacts | `runs.get`, `runs.cancel`, `events.subscribe`, `artifacts.describe`, `artifacts.read`, `artifacts.delete`; `deepchat run …` | read / local-maintenance | H owns all; A may inspect/pass owned IDs but cannot read bytes, delete, or cancel unrelated work | never | JSONL or binary artifact for H; metadata for A | +| 12. CLI diagnostics | `cli.status`, `cli.version`, `cli.capabilities`, `cli.doctor`; top-level commands | read | H, A | never | stable JSON/text | +| 13. Benchmark automation | client-side stable modes over compute methods; `--json`, `--jsonl`, stdin, timeout, cancel | inherited | H, scoped A | inherited | reproducible result envelope | +| 14. Agent-scoped CLI use | internal `agentCli.issueScopedToken` plus bundled Skill instructions | security-config (internal) | trusted main runtime issues; A consumes | not exposed on socket | short-lived in-memory authority | + +Surface names and contracts are frozen by `surfaceVersion`. Additive entries require an advertised +capability and surface-version change policy; removal or semantic incompatibility requires a new +surface major. App and protocol versions are reported independently. + +Provider creation and updates accept only allowlisted adapter fields and credential-free HTTP(S) +base URLs. V1 `providers.setCredential` handles API keys only, read from bounded stdin; OAuth flows +and structured AWS/Vertex credentials remain on their existing typed renderer flows instead of +accepting a generic credential object. Public model-config contracts reject unknown fields and omit +main-owned identity fields even though the legacy renderer contract remains intentionally loose. + +## Caller Model and Route Migration + +The current optional renderer fields become a discriminated caller: + +```ts +type RendererRouteCaller = { + kind: 'renderer' + webContentsId: number + windowId: number | null +} + +type CliRouteCaller = { + kind: 'cli' + connectionId: string + principal: 'human' | 'agent' + scopes: readonly CliScope[] + conversationId?: string + expiresAt?: number +} + +type InternalRouteCaller = { + kind: 'internal' + component: 'scheduler' | 'migration' | 'agent-cli' +} + +type RouteContext = { caller: RouteCaller } +``` + +Renderer-only handlers assert `caller.kind === 'renderer'` before accessing window identity. Public +headless handlers either accept CLI/internal callers or delegate to a domain service that has no +desktop dependency. There are no sentinel window IDs. + +The migration touches these ten integration files: + +1. `src/main/routes/routeRegistry.ts`: define `RouteCaller` and wrapped `RouteContext`. +2. `src/main/routes/index.ts`: build renderer callers and make startup tracking renderer-aware. +3. `src/main/app/composition.ts`: construct internal/CLI callers and keep main-window checks explicit. +4. `src/main/app/routes.ts`: require renderer identity for window/session ownership behavior. +5. `src/main/desktop/routes.ts`: reject non-renderer callers at the desktop boundary. +6. `src/main/mcp/routes.ts`: adapt renderer callers to the existing MCP App ownership context while + allowing only separately selected headless MCP administration methods. +7. `src/main/session/sessionService.ts`: separate renderer-bound create/activate operations from + detached headless creation. +8. `src/main/session/routes.ts`: use caller narrowing for submission cancellation and UI-bound work. +9. `src/main/provider/routes.ts`: target renderer-specific OAuth/debug events only to renderer + callers. +10. `src/main/notifications/routes.ts`: keep readiness and notification ownership renderer-only. + +`McpAppRouteContext` in `appHost.ts` and `sandboxRegistry.ts` intentionally remains a domain-owned +renderer context. `mcp/routes.ts` is its adapter, avoiding CLI concepts inside the MCP App sandbox. + +## Effect Policy + +Authorization is `approvalPolicy(effect, caller, operation)`, not `isWrite`. + +| Effect | Human CLI | Agent CLI | Examples | +| --- | --- | --- | --- | +| `read` | allow | allow with scope | status, redacted lists | +| `compute` | allow with rate limits | allow with scope and quota | model/media/OCR | +| `local-maintenance` | allow and audit | deny | OCR cache clear, owned artifact delete | +| `preference-write` | allow and audit | renderer approval when allowlisted | language or UI-safe defaults | +| `security-config` | renderer approval | renderer approval only when explicitly allowlisted | MCP enablement, proxy/security policy | +| `execution-config` | renderer approval | deny | default provider/model, executable configuration | +| `supply-chain` | renderer approval | renderer approval only when explicitly allowlisted | Skill/MCP installation | +| `credential` | renderer approval | deny | provider or MCP secret update | +| `destructive` | renderer approval | deny | provider/Skill/MCP removal | + +Per-invocation provider/model selection is compute input, not an execution-config mutation. Benchmark +harnesses must use those per-call fields rather than changing global defaults. + +Agent Skill installation accepts only a query-free HTTPS URL with no embedded credentials or +fragment. Human CLI may still use a signed URL; its query remains bound to the approval arguments but +is represented only as `queryPresent` in display and audit projections. + +An Agent MCP add is limited to an unauthenticated HTTPS remote endpoint, always stores the server +disabled, and requires a bounded, complete renderer view of its endpoint and public metadata. Agent +input rejects stdio commands, headers, authorization bindings, non-HTTPS endpoints, and +configurations larger than the approval UI can safely review. MCP update remains human-only because +the current MCP service immediately restarts a running server after any update; treating it as a +passive configuration mutation would hide an execution side effect. + +Every policy decision is audited with timestamp, caller kind, connection/conversation scope, +operation, effect, outcome, request ID, and redacted argument hash. Tokens, secrets, raw prompts, +uploaded bytes, and full generated output are not audit fields. + +## ApprovalBroker + +The generic core owns only state-machine mechanics: + +```ts +interface ApprovalBroker { + create(input: ApprovalBinding, options: ApprovalOptions): ApprovalSnapshot + wait(requestId: string, signal?: AbortSignal): Promise + resolve(input: ApprovalResolution): boolean + consumeApproved(match: ApprovalMatch): boolean + cancelScope(scopeKey: string): void + clear(): void + subscribe(listener: (event: ApprovalEvent) => void): () => void +} +``` + +`ApprovalBinding` contains a main-generated request/execution identity, scope key, operation, effect, +canonical argument hash, redacted display data, and expiry. Canonicalization preserves the current +depth, key-count, byte, finite-number, JSON-only, and cycle limits. Display data is supplied +separately so credential values cannot leak through an argument preview. + +Two adapters preserve distinct domain semantics: + +- `ToolPermissionBroker` retains model pre-check followed by approved one-shot execution, current + MCP App waiting behavior, tool naming, permission modes, and conversation cancellation. +- `CliMutationGuard` creates a unique non-deduplicated approval for the current authenticated request, + publishes it to a trusted renderer target, and awaits the decision while the HTTP request stays + open. Approval resumes that exact server-side continuation. Socket abort, timeout, shutdown, or + scope cancellation denies it and makes later resolution fail. + +CLI approvals do not deduplicate identical concurrent calls: otherwise one click could resume +multiple mutations. The core may retain tool-domain deduplication through an explicit adapter key. + +Renderer resolves through a new canonical `approvals.resolve` typed IPC route. The handler rejects +all non-renderer callers and validates the request's renderer target/scope. `/v1/approvals/*/resolve` +does not exist. Existing `chat.respondToolInteraction` behavior remains a tool adapter and is not +forged for CLI requests. + +## Model and Media Execution + +### Raw model invocation + +`models.invoke` resolves a provider/model through main and calls the existing provider `coreStream` +foundation with: + +- a real system-role message when supplied; +- user/assistant messages from a bounded typed request; +- `tools: []` and no tool loop; +- no session, memory retrieval, Skills, attachments, or Agent orchestration; +- per-invocation generation settings without mutating defaults. + +The server always produces the canonical stream. Human-readable and non-stream JSON CLI modes buffer +that stream in the CLI; main does not maintain a second non-stream execution path. Events include +text/reasoning deltas as permitted, usage, finish reason, and resolved provider/model identity. The +terminal result reports rate-limit queue duration plus request-relative first-provider-event, +first-text, and total latency. Provider failures preserve a normalized upstream HTTP status and +retryability when available, but raw upstream messages, codes, headers, and response bodies never +cross the local-control boundary because they may contain credentials or request content. + +### Media and speech + +Image and video generation reuse existing standalone provider capabilities and write binary results +to `ArtifactSpool`. Speech gets a formal `generateSpeechStandalone` provider-runtime capability with +a typed audio result. Its implementation may collect the current VoiceAI stream internally, but the +public contract must not depend on audio currently appearing in an image-named stream event. + +Transcription accepts a human upload or an owned Agent artifact. Base64 remains an internal renderer +compatibility shape, not the preferred CLI transport. + +### Cost and concurrency + +V1 uses bounded request sizes, per-connection concurrency, per-method rate limits, Agent call counts, +and media/OCR byte quotas. It does not introduce a currency budget engine. Interactive renderer work +has priority; CLI/OCR/benchmark work enters background capacity and cannot starve chat. + +## Offline OCR + +OCR is an independent V1 domain, not a model alias. `ocr.extractUpload` is human-only and consumes a +bounded uploaded image/PDF. `ocr.extractArtifact` accepts only a DeepChat-owned attachment/artifact or +a main-issued file grant. If file grants are not delivered with Agent integration, standalone Agent +OCR remains unavailable rather than accepting a path. + +Explicit OCR is independent of the chat setting that automatically routes non-vision attachments. +Text is normalized and token/character bounded, returned directly, and never enters `ArtifactSpool`. +Detection boxes, confidence/layout output, server-side batch, and runtime model management are out of +scope. + +`ocr.clearCache` is `local-maintenance`: human CLI is allowed without main-owned approval, Agent CLI +is denied, extraction-in-progress rejection remains intact, and the operation is audited. The cache +contains derived data only; clearing does not touch original files, attachment snapshots, runtime +assets, settings, or credentials. + +### OCR benchmark semantics + +Results distinguish: + +- `cache-hit`; +- `cache-miss-warm-runtime`; +- `cold-runtime`; +- `offline-availability`. + +They report at least `runtimeStateBefore`, `runtimeWasReady`, cache state, input bytes/type, pages +where applicable, duration, output characters/tokens, engine identity, app/protocol/surface version, +and availability. +`clearCache()` first calls `getResources()`, which initializes the resource graph and cache backend +but does not spawn the OCR helper. A clear followed by extraction is a warm-runtime miss only when +the helper was already `ready`; a fresh or restarted application whose host is still `idle` produces +a cold-runtime miss. `busy`, `starting`, and `stopping` states reject clearing. Classification always +uses the actual pre-extraction host state. V1 does not expose `restart-runtime` merely to improve a +benchmark. + +## File I/O Boundary + +Human and Agent file flows are deliberately different: + +- Human input: the CLI opens a path and uploads bounded bytes. Main receives bytes plus safe metadata, + never an arbitrary source path. +- Agent input: only DeepChat-owned attachment/artifact IDs or a main-resolved file-grant ID are + accepted. The main process canonicalizes and validates a grant; the CLI cannot mint one. +- Human output: the CLI downloads an owned artifact into a verified temporary file beside `--out`. + No-overwrite publication uses an atomic hardlink when supported and an exclusive copy plus `fsync` + on filesystems without hardlinks; neither path replaces an existing destination. Replacement + requires explicit `--overwrite`. +- Agent output: main returns artifact IDs and metadata only. Artifact byte download, stdout byte + export, deletion, and `--out` are rejected for Agent callers; IDs may be passed to another scoped + operation. + +Bounded upload bodies control main-process resources and keep transport authority narrow; they do not +prove where the CLI process obtained bytes. Today `cat` is already a safe shell command, so this is +not presented as closing the first possible Agent read path. + +The current shell risk parser also omits `>` and `>>`: a command beginning with safe `cat` can redirect +output without leaving the whitelist. Therefore the existing system already has a silent write path, +and the earlier claim that only `cp`/`mv` could write was incorrect. Before any Agent CLI surface is +enabled, redirection (including descriptor duplication and here-document/here-string variants) must +be tokenized conservatively and must force command approval. The CLI split still prevents main from +becoming an additional arbitrary-path writer, provides auditable provenance, and remains compatible +with a future tighter shell sandbox. + +## ArtifactSpool + +The spool is output-only and intentionally smaller than a general asset store: + +- random unguessable IDs and exclusive file creation in an application-private directory; +- in-memory ownership metadata bound to request, connection/principal, media type, size, hash, + creation, expiry, and suggested filename; +- per-artifact, per-request, per-connection, and aggregate byte/count limits; +- streaming writes with hash/size accounting and atomic publication; +- ownership checks on describe/read/delete and no path exposure; +- TTL cleanup, request-failure cleanup for unpublished output, startup cleanup after crashes, and + shutdown cleanup; published artifacts survive their creating HTTP connection because download uses + a separate request; +- bounded streaming download with backpressure. + +For a human descriptor, ownership means the same local application user, not one transient HTTP +connection. `connectionId` remains quota and audit provenance because publication and detached-run +recovery intentionally span separate CLI processes. Agent ownership remains conversation-bound. + +Input uploads use a separate private temporary-body utility and never become spool artifacts unless a +domain operation deliberately produces a new output artifact. + +## Typed Event Hub and Detached Runs + +The Event Hub envelope contains event name, schema version, sequence, timestamp, target, request/run +identity, and typed payload. Targets are explicit: renderer, CLI connection, request, run/session, or +trusted internal subscriber. CLI-originated prompt content, generation deltas, approvals, and run +events are never broadcast to all windows. + +Each subscriber has a bounded queue. Slow clients receive a terminal overflow error and disconnect; +main does not accumulate unbounded events. Request streams preserve per-request order. Cross-request +global ordering is not promised. Retention is bounded both per stream and globally, inactive streams +expire after 30 minutes, and superseded full message snapshots are coalesced in recovery history +without changing live delivery. Cursors include a per-stream incarnation so an evicted and recreated +stream cannot accept a cursor from its prior history; recovery falls back to the durable run snapshot. + +Raw and media requests are cancelled when their connection/request aborts unless an operation +explicitly supports detachment. `sessions.runDetached` first creates a detached session through the +existing lifecycle, then starts the initial turn. It returns a durable run/session identity before +streaming. Disconnect does not destroy a detached run; status/messages can be recovered from session +state and event cursors. If initial-turn startup fails, the response and run event retain that durable +identity but expose only a stable failure message; upstream error text is excluded from public output +and logs. `runs.cancel` is idempotent and ownership checked. + +`events.subscribe` is human-only in V1. An Agent can own only its currently executing conversation, +so waiting on that run from its bash tool would deadlock the run on itself. Agent callers may use the +nonblocking owned `runs.get` snapshot and idempotent `runs.cancel`; they cannot invoke `run watch`. + +## CLI Product Contract + +The command grammar starts with exactly two capability tokens: + +```text +deepchat [options] +``` + +The local-only `deepchat help` command is the sole one-token exception. It prints static client help +without discovery, authentication, or a main-process request. Per-command help remains +`deepchat --help`; `deepchat help commands` is rejected. + +Global output/timeout flags follow the domain and verb, or use environment variables. Forms such as +`deepchat --json image generate` are rejected. This is a security contract: the existing shell +permission signature takes the base command and next token, but takes a third token when the second +starts with `-`; prefix flags would fragment or mis-scope session approvals. + +`deepchat` is never added to `SAFE_COMMANDS`. When an Agent invokes it through a shell, the controls +are: + +1. `CommandPermissionService` shell gate; +2. authenticated token and scopes; +3. `CLI_SURFACE` caller policy; +4. effect policy and renderer approval; +5. rate, quota, ownership, and audit enforcement. + +The shared command catalog is the sole mapping from ` ` to route identity. Agent +issuance resolves that catalog entry against `CLI_SURFACE`, then mints exactly the route scopes; the +token authority has no broad default-scope fallback. Commands marked human-only or unknown fail +closed without a token that could fall back to human authority. + +The first control is a hard dependency, not a decorative outer layer. Its parser must recognize +output/input redirection, file-descriptor redirection, command substitution, process substitution, +pipelines, separators, and newlines before Agent CLI is enabled. A safe base command must not override +critical compound-shell syntax. + +Human-friendly output goes to stdout, diagnostics to stderr, and machine modes are stable: + +- `--json` emits exactly one result envelope; +- `--jsonl` emits versioned events and one terminal result/error record; +- prompts and payloads may come from stdin without shell quoting; +- timeout sends cancellation before exiting; +- SIGINT cancels once, waits a bounded grace period, then exits; +- no ANSI/progress UI appears in machine modes. + +Exit codes are stable: `0` success, `2` usage, `3` unavailable/version mismatch, `4` +authentication/authorization, `5` approval denied/timeout, `6` domain failure, `7` timeout/cancel, +and `8` internal/protocol failure. + +The packaged CLI source lives in `src/cli`; main-side transport adapters live in `src/main/cli`. +The built standalone entry and launchers use the bundled Node runtime and ship outside `app.asar` as +application resources. After the local control server is listening, startup automatically and +idempotently places a small regular-file shim in the platform's user command location; there is no +settings toggle. The shim pins the validated CLI module and bundled Node paths from the current app +installation and never falls back to a runtime discovered through `PATH`. Startup atomically +reconciles its content hash after an app move or upgrade and migrates a still-owned legacy POSIX +symlink. It never overwrites an unowned command or modified shell block, does not install an npm +package or copy credentials, and records enough ownership state for exact rollback during full data +reset. Full reset first stops the local control server, then removes only launcher files whose +ownership and content still match. An ownership conflict, inspection failure, or removal failure +preserves the external command/profile, emits a secret-safe diagnostic, and never blocks deletion of +DeepChat application data. + +Main owns the server lifetime. Desktop shutdown first stops accepting new work, aborts every pending +request and stream with a typed `unavailable` result when the connection remains writable, then +closes idle and active sockets within a bounded grace period. A thin CLI invocation has no daemon +mode and must exit after that terminal result or EOF; it must never outlive DeepChat waiting on a +stale local endpoint. + +## Agent Token and Bundled Skill + +An internal Agent meta-tool asks main to mint an in-memory token containing principal `agent`, a +conversation binding, allowed surface scopes, expiry, call/byte quotas, and a random identifier. +The token is passed to the CLI invocation environment and is never written to the descriptor or +transcript. Main revokes it when the session ends, permission caches clear, or the app stops. + +The bundled CLI directory is prepended to the effective controlled shell `PATH`; existing path +entries and other controlled environment values are retained and de-duplicated. Agent integration +must not replace `PATH` with the CLI directory alone. + +Agent defaults allow bounded raw compute/media and owned-artifact operations. They deny +`sessions.runDetached`, credentials, destructive operations, arbitrary input paths, and output paths. +Management mutations are either denied or wait for renderer approval according to the matrix. + +The bundled Skill documents command discovery, machine output, artifact handling, stdin, timeouts, +and the rule that the CLI cannot approve itself. It must not instruct an Agent to read the human +descriptor. + +## Benchmark Contract + +Benchmarks are external harnesses over stable CLI output. Terminal records include: + +- requested and resolved provider/model; +- redacted generation settings and capability identity; +- input/output token or byte counts where available; +- usage, queue/first-event/first-text/total latency, finish reason, retries, and cancellation outcome; +- artifact MIME, size, hash, and ID without local paths; +- OCR cache/runtime classification; +- app, protocol, surface, CLI, and provider adapter versions. + +Raw text, media, speech, and OCR are benchmarkable as soon as their surfaces land. Full Agent +benchmarks use detached runs and the Event Hub. The harness controls repetitions, datasets, scoring, +and cold application restarts. + +## Compatibility and Failure Semantics + +- Renderer IPC retains current route names and outputs unless a canonical new route is added. +- Existing tool approvals retain their request/consume behavior through the adapter. +- Existing `chat.respondToolInteraction` remains supported; CLI approval uses a new renderer route. +- Provider secrets never appear in new public provider DTOs, logs, errors, events, or audit records. +- Unsupported protocol/surface versions fail before method dispatch and print actionable version + information. +- App shutdown, token expiry, descriptor rotation, database maintenance, queue saturation, body-limit + failure, and renderer absence have typed terminal errors. +- A pending sensitive CLI mutation fails closed if no trusted renderer can present it. +- Retrying a mutation requires a new authenticated request and a new approval; request IDs are not + idempotency keys unless a method explicitly declares an idempotency contract. + +## Acceptance Criteria + +- Packaged macOS, Windows, and Linux applications include a working `deepchat` launcher that connects + only to the local endpoint and reports compatible version/capability data. +- Surface tests prove every exposed method is declared, registered, classified, bounded, and allowed + only for its caller/scopes; internal routes are unreachable. +- Transport tests cover descriptor permissions/rotation, token comparison, stale endpoints, malformed + HTTP, fixed and chunked body limits, spill cleanup, aborts, backpressure, shutdown ordering, and + termination of active CLI streams when the desktop exits. +- Caller migration tests prove renderer-only routes reject CLI/internal callers without sentinel IDs. +- Approval tests cover binding, redaction, timeout, abort, scope cancellation, single consumption, + concurrent identical CLI mutations, renderer-only resolution, and preserved tool behavior. +- Model/media/speech tests prove credentials remain in main, raw invoke has no tools/session/memory, + stream order is stable, and binary results use owned artifacts. +- OCR tests cover upload/artifact caller split, output bounds, queue priority, explicit-setting + independence, clear-cache policy, and all four benchmark classifications. +- Agent tests cover detached recovery/cancellation, targeted events, scoped-token expiry/revocation, + recursion denial, arbitrary-path and artifact-byte denial, descriptor-token fallback denial, and + quota enforcement. +- CLI tests cover two-token grammar, post-command flags, stdin, JSON/JSONL, exit codes, signal/timeout, + no-overwrite/overwrite, and Agent rejection of `--out`. +- Command-permission tests prove redirection, process substitution, separators/newlines, and other + compound syntax cannot inherit a safe base-command decision. +- Format, i18n validation, lint, typecheck, focused tests, full tests, production build, and + current-platform packaged smoke pass where local prerequisites allow. + +## Open Questions + +None. Policy values above are the V1 baseline; future changes require an explicit surface/security +review rather than implicit widening. diff --git a/docs/architecture/local-control-plane/tasks.md b/docs/architecture/local-control-plane/tasks.md new file mode 100644 index 0000000000..c1d111c878 --- /dev/null +++ b/docs/architecture/local-control-plane/tasks.md @@ -0,0 +1,132 @@ +# Local Control Plane and Bundled CLI V1 Tasks + +## Architecture and Scope + +- [x] Verify the current route registry, provider runtime, detached session, event publication, + permission broker, command signature, OCR runtime, and OCR cache behavior. +- [x] Freeze the V1 goals, exclusions, 14 capability groups, effect taxonomy, caller model, file-I/O + split, benchmark semantics, and implementation order. +- [x] Specify `CLI_SURFACE_V1`, the ten-file `RouteCaller` migration, and `ApprovalBroker` adapters. +- [x] Specify transport, discovery, artifact, event, CLI grammar, packaging, and Agent-token contracts. +- [x] Complete the severity-ranked architecture-document review and resolve its findings. +- [x] Commit the accepted SDD locally. + +## Typed Foundation + +- [x] Add `RouteCaller` and migrate renderer-dependent integrations without behavior change. +- [x] Add canonical local-control contracts and redacted public DTOs. +- [x] Define and test the deny-by-default versioned surface registry. +- [x] Add local-control error codes, request/result envelopes, and route limits. + +## Local Transport and CLI + +- [x] Implement atomic private descriptor creation, token rotation, and stale cleanup. +- [x] Implement UDS/named-pipe HTTP server lifecycle and authentication. +- [x] Implement fixed/chunked body bounds, spill-to-disk, abort handling, and cleanup. +- [x] Implement the bundled thin CLI, two-token grammar, version negotiation, output modes, signals, + fail-closed Agent-token selection, timeouts, and exit codes. +- [x] Add descriptor, transport, auth, body-boundary, parser, and shutdown tests. + +## Compute and Artifacts + +- [x] Add raw `models.invoke` over `coreStream` with no Agent/session/tool side effects, explicit + benchmark timings, and secret-safe provider failure metadata. +- [x] Add image and video standalone generation surfaces. +- [x] Add formal standalone speech generation and typed audio output. +- [x] Add upload and owned-artifact transcription inputs. +- [x] Implement output-only `ArtifactSpool` ownership, quotas, expiry, cleanup, and portable + no-overwrite downloads on filesystems without hardlinks. +- [x] Add stream, media, speech, transcription, artifact, and quota tests. + +## OCR + +- [x] Add explicit upload and owned-artifact extraction contracts and handlers. +- [x] Preserve automatic-attachment-setting independence and background priority. +- [x] Enforce bounded text output and exclude layout/batch/model administration. +- [x] Classify cache clear as audited human-only `local-maintenance` without approval. +- [x] Report cache hit, warm-runtime miss, cold-runtime, and offline metrics accurately. +- [x] Add OCR caller, input, cache, runtime-state, output-bound, and benchmark tests. + +## Effects and Approval + +- [x] Extract generic canonicalization/pending/timeout/consume mechanics into `ApprovalBroker`. +- [x] Preserve MCP, Agent pre-check, and live-delegation behavior through `ToolPermissionBroker`. +- [x] Add `CliMutationGuard` with unique live-request-bound approvals and no replay token. +- [x] Add targeted approval events and renderer-only `approvals.resolve` IPC. +- [x] Implement effect/caller/operation policy, scopes, quotas, rate limits, and redacted audit. +- [x] Add concurrent-identical-call, timeout, abort, cancellation, redaction, and compatibility tests. + +## Administration Surface + +- [x] Add public/redacted settings reads and allowlisted per-effect updates. +- [x] Add public/redacted provider/model reads and separated credential mutations. +- [x] Add reviewed Skill list/enable/install/uninstall operations. +- [x] Add reviewed MCP list/add/update/remove/enable/start/stop operations. +- [x] Prove raw MCP calls, arbitrary internal routes, secret reads, and Agent destructive operations are + unreachable. + +## Events and Agent Runs + +- [x] Add explicit renderer/connection/request/run Event Hub targets. +- [x] Add bounded subscriber queues and global retention, idle expiry, ordering, overflow, + disconnect, and incarnation-safe recovery semantics. +- [x] Compose detached session creation with initial-turn execution. +- [x] Add owned status, event streaming, result recovery, and idempotent cancellation. +- [x] Add event-isolation, backpressure, detached-recovery, startup-error redaction, + recursion-denial, and cancellation tests. + +## Packaging and Agent Use + +- [x] Package the CLI with the bundled Node runtime on all supported targets. +- [x] Add automatic, idempotent, reversible platform launcher/PATH integration with no settings + toggle, a hash-reconciled regular-file shim, legacy symlink migration, and no system-Node fallback. +- [x] Keep full data reset available when launcher ownership conflicts or cleanup fails, while + preserving external files and logging only safe diagnostics. +- [x] Add in-memory scoped Agent token issuance, expiry, revocation, and quotas. +- [x] Derive Agent token scopes from the shared command catalog and fail closed for human-only + commands, including self-blocking `run watch`. +- [x] Harden shell permission checks for redirection and compound syntax before Agent enablement. +- [x] Keep `deepchat` out of `SAFE_COMMANDS`, enforce domain/verb-first grammar, and deny Agent + artifact-byte/output-path access. +- [x] Prepend the bundled CLI directory while retaining the controlled Agent command `PATH`. +- [x] Add the bundled CLI Skill without exposing the human descriptor. +- [x] Add bundled diagnostics/compute/artifact/OCR/Agent-policy and desktop-shutdown smoke coverage. + +## Validation and Delivery + +- [x] Run focused tests after each implementation slice. +- [x] Run format and i18n validation. +- [x] Run lint and typecheck. +- [x] Run the full test suite and production build. +- [x] Complete current-platform unsigned packaging with the pinned bundled runtimes. +- [x] Run packaged CLI smoke where local prerequisites allow. +- [x] Complete a severity-ranked review before every commit and resolve findings. +- [x] Commit all V1 work locally with behavior-specific messages. +- [x] Do not push. + +## Local Validation Evidence + +Recorded on 2026-08-05 using macOS arm64, Node 24.14.1, and pnpm 10.33.4: + +- `pnpm exec vitest run --config vitest.config.ts test/main/cli`: 26 files and 262 tests + passed, including the real bundled CLI child-process smoke for desktop shutdown. +- `pnpm test`: 778 files and 8,199 tests passed; 26 files and 348 tests were skipped by + their existing suite configuration. +- `pnpm run build`: passed Node and renderer typecheck, all Electron production bundles, and + `out/cli/deepchat.mjs` generation. The provider catalog fetch failed closed to the committed + snapshot; the ACP registry refresh succeeded without a tracked diff. +- `pnpm run format:check`, `pnpm run i18n`, `pnpm run lint`, and `pnpm run typecheck`: passed. +- `pnpm run installRuntime:mac:arm64`: installed the pinned uv 0.9.18, Node 24.14.1, and + rtk 0.43.0 runtimes with the local HTTP/SOCKS proxy configured. The installed Node executable + matched the manifest SHA-256 and reported the pinned version. +- `pnpm run build:unpack`: passed the application build, native rebuild, Electron extraction, and + unsigned macOS arm64 packaging. The completed app contains `deepchat`, `deepchat.cmd`, + `deepchat.mjs`, and the executable bundled Node runtime under `app.asar.unpacked`; the POSIX + launcher retains its executable bit. Code signing and notarization were skipped as expected for + this local unsigned build. +- The completed packaged launcher returned the versioned `unavailable` envelope and exit code `3` + against an isolated stopped-desktop profile. With the unpacked app running against another + isolated profile, packaged `system status`, `system version`, `system capabilities`, and + `system doctor` commands all exited `0`; doctor reported healthy transport, descriptor, + 46-method V1 surface, and renderer approval checks. App shutdown ran `cliServer.stop`, removed + the descriptor and socket, left no packaged app process, and restored launcher exit code `3`. diff --git a/docs/guides/cli.md b/docs/guides/cli.md new file mode 100644 index 0000000000..53d7fc6f14 --- /dev/null +++ b/docs/guides/cli.md @@ -0,0 +1,258 @@ +# DeepChat CLI V1 + +DeepChat 随桌面应用提供 `deepchat` 命令。命令本身是薄客户端,所有 Provider、凭据、Skill、 +MCP、OCR、Artifact 和 Agent 状态仍由正在运行的 DeepChat main 进程持有。 + +## 生命周期 + +- 不提供 CLI 开关。DeepChat 启动时自动启动本机 control plane。 +- server 监听成功后,DeepChat 自动、幂等地安装或修复自己拥有的 `deepchat` launcher。 +- 用户命令位置中的 launcher 是普通文件;它固定引用当前应用中校验过的 CLI 与 bundled Node, + 应用移动或升级后由下次启动原子刷新。旧版 owned symlink 会自动迁移。 +- launcher 不会回退到 `PATH` 中的系统 Node;bundled runtime 缺失时以 `127` 失败关闭。 +- launcher 冲突时保持失败关闭:不会覆盖同名的外部命令、被修改的 managed block、符号链接 + profile 或不属于 DeepChat 的文件。 +- launcher 不是 daemon。DeepChat 未运行时,命令返回 `unavailable`,退出码为 `3`。 +- DeepChat 退出时先停止接收请求,再取消进行中的 RPC、上传、下载和 stream。连接会在有界宽限期 + 内关闭,所有已连接且正在等待 main 的 CLI 进程自行退出,退出码为 `3`;不会遗留 CLI 后台进程。 +- 普通退出保留 launcher,便于下次启动后直接使用。完整数据重置只删除仍能证明由 DeepChat + 拥有且未被修改的 launcher 集成;ownership 冲突或清理失败会保留外部命令/profile 并记录安全 + 诊断,但不会阻止应用数据重置。 + +先用诊断命令确认桌面端和协议可用: + +```bash +deepchat system status --json +deepchat system version --json +deepchat system capabilities --json +deepchat system doctor --json +``` + +## 命令合同 + +所有命令都使用固定的两段式前缀: + +```text +deepchat [options] +``` + +`--json`、`--jsonl`、`--timeout` 和领域参数必须放在 domain 与 verb 之后。下面的形式会被拒绝: + +```text +deepchat --json image generate +``` + +这不只是命令风格。Agent shell 的会话权限按命令签名缓存,两段式前缀确保批准粒度稳定在 +`deepchat `,不会因为前置 flag 变成另一组权限。 + +查看全部命令或单个命令参数: + +```bash +deepchat help +deepchat image generate --help +``` + +输出模式: + +- 默认 text:给人阅读,stdout 只放结果,诊断信息写入 stderr。 +- `--json`:只输出一个稳定的 result 或 error envelope。 +- `--jsonl`:逐行输出有版本的事件,最后一行是终态 result 或 error。 +- streaming 命令在 text/JSON 模式由 CLI 有界收集;main 始终只维护一条 canonical stream。 +- machine 模式不输出 ANSI progress UI。 + +稳定退出码: + +| Code | Meaning | +| --- | --- | +| `0` | success | +| `2` | invalid command or input | +| `3` | DeepChat unavailable or protocol/surface mismatch | +| `4` | authentication or authorization failure | +| `5` | renderer approval denied or timed out | +| `6` | domain operation failed | +| `7` | timeout, signal, or cancellation | +| `8` | internal or protocol failure | + +## V1 能力清单 + +| # | 能力 | 命令域 | 关键边界 | +| --- | --- | --- | --- | +| 1 | 文本模型调用 | `model invoke` | raw provider stream,无 Session、Tool、Memory 或 Skill 副作用 | +| 2 | 图片生成 | `image generate` | 二进制结果进入 ArtifactSpool | +| 3 | 音频生成与识别 | `audio speak`, `audio transcribe` | speech 为正式 standalone 能力;转写支持上传或 owned artifact | +| 4 | 视频生成 | `video generate` | 二进制结果进入 ArtifactSpool | +| 5 | 离线 OCR | `ocr status`, `ocr extract`, `ocr clear-cache` | 图片/PDF,文本内联返回,不进入 ArtifactSpool | +| 6 | 完整 Agent run | `agent run`, `run get/watch/cancel` | durable detached Session,可恢复、订阅和幂等取消 | +| 7 | 公共设置 | `settings get/set` | 只读写 typed allowlist,不是任意配置通道 | +| 8 | Provider 管理 | `provider list/test/add/update/set-credential/clear-credential/remove` | 公共 DTO 脱敏;凭据只从 stdin 进入 main | +| 9 | Model 管理 | `model list/enable/disable/config-get/config-set/config-reset` | 运行时列表与严格公共配置分离 | +| 10 | Skill 管理 | `skill list/install/enable/disable/remove` | ZIP/HTTPS 安装有边界与供应链批准 | +| 11 | MCP 管理 | `mcp list/add/update/enable/disable/start/stop/remove` | 仅公开管理面,不暴露 raw MCP tool tunnel | +| 12 | Artifact 管理 | `artifact describe/get/delete` | ownership、TTL、hash、配额与跨文件系统 no-overwrite | +| 13 | 诊断和 benchmark 输出 | `system ...`, JSON/JSONL、stdin、timeout | 外部 harness 负责数据集、重复、打分和冷启动 | +| 14 | Agent scoped CLI | bundled `deepchat-cli` Skill | main 签发短期、按调用和字节限额的 token,不暴露 human descriptor | + +## 模型、媒体与 OCR + +先枚举可用 Provider 和模型 ID,不要根据 UI 名称猜测: + +```bash +deepchat provider list --enabled-only --json +deepchat model list --provider --json +deepchat model config-get --provider --model --json +``` + +模型与媒体调用示例: + +```bash +deepchat model invoke --provider --model \ + --prompt 'Explain the result' --jsonl + +deepchat image generate --provider --model \ + --prompt 'A product photo' --jsonl + +deepchat video generate --provider --model \ + --prompt 'A five second product turntable' --jsonl + +deepchat audio speak --provider --model \ + --text 'Hello from DeepChat' --jsonl + +deepchat audio transcribe --provider --model \ + --file ./sample.wav --json +``` + +较长的 prompt、speech 文本和敏感值应通过 stdin 传递,避免 shell quoting 与 process-list 暴露: + +```bash +deepchat model invoke --provider --model --stdin --jsonl +deepchat provider set-credential --provider --stdin --json +``` + +OCR 是独立的随包离线能力,不是模型别名,也不依赖聊天里的“非视觉模型自动提取附件”设置: + +```bash +deepchat ocr status --json +deepchat ocr extract --file ./scan.png --json +deepchat ocr extract --file ./document.pdf --page-count 12 --max-tokens 8000 --json +deepchat ocr clear-cache --json +``` + +OCR 输出记录真实的 cache/runtime 状态: + +- `hit`:命中派生缓存; +- `miss-warm`:未命中缓存,提取前 helper 已 ready; +- `cold-runtime`:未命中缓存,提取前 helper 尚未 ready; +- offline:runtime asset 不可用,调用以 typed unavailable error 结束。 + +`ocr clear-cache` 只清理可再生的派生缓存,不重启 helper,也不保证制造 cold-runtime 样本。严格的 +冷启动 benchmark 应由外部 harness 重启 DeepChat,并同时记录 app/protocol/surface 版本、 +`runtimeStateBefore`、输入大小、耗时和输出 token 数。 + +## Artifact 与文件边界 + +图片、视频和 speech 的二进制结果以临时 Artifact 返回。结果包含随机 ID、MIME、大小、SHA-256、 +过期时间和建议文件名,不包含 main 内部路径。 + +Human terminal 可以读取或删除自己可见的 Artifact: + +```bash +deepchat artifact describe --id --json +deepchat artifact get --id --out ./result.png --json +deepchat artifact get --id --out ./result.png --overwrite --json +deepchat artifact delete --id --json +``` + +`artifact get` 默认不覆盖现有文件。main 不接受输出路径;它只流式返回受 ownership 保护的字节, +最终路径由 human CLI 在本地处理。 + +输入同样按 caller 分流:human CLI 打开本地文件并上传有界字节,main 不接受任意输入路径;Agent +只能传递 DeepChat-owned Artifact ID。Agent 不能使用 `--file`、`--out`、`--overwrite`,不能下载或 +删除 Artifact 字节。 + +## Agent run + +完整 Agent 工作流与 raw `model invoke` 分开: + +```bash +deepchat agent run --prompt 'Inspect the project and summarize the issue' --json +deepchat run watch --run --jsonl +deepchat run get --run --json +deepchat run cancel --run --json +``` + +`agent run` 先创建 durable detached Session,再启动首轮。CLI 断开不会删除 run;可以通过 +`run get` 恢复消息,human caller 可通过 cursor 续接 `run watch`。Agent caller 自身不能递归执行 +`agent run`,也不能等待当前正在执行的自身 run;Agent 仅可使用非阻塞的 `run get` 与幂等的 +`run cancel`。 + +## 设置、Skill 与 MCP + +公共读取都是脱敏的: + +```bash +deepchat settings get --json +deepchat settings get --keys privacyModeEnabled,ocrBackend --json +deepchat skill list --json +deepchat mcp list --json +``` + +变更示例: + +```bash +deepchat settings set --key ocrBackend --value '"cpu"' --json +deepchat model enable --provider --model --json +deepchat skill install --url --json +deepchat mcp add --name --stdin --json +``` + +设置只覆盖 canonical contract 中的公开 key;Provider/Model、Skill、MCP 也各自使用严格输入,不能 +借 CLI 读取 secret、数据库字段、环境变量或任意内部 route。 + +## 批准与 Agent 安全模型 + +Human 发起敏感 mutation 时,请求会保持挂起,由 DeepChat renderer 展示批准。批准绑定到当前 +method、规范化参数 hash、effect、scope、有效期和 live request;CLI 只会等待结果,无法取得或重放 +ticket,也不存在 `--confirmed` 一类绕过参数。 + +Agent 调用额外经过以下控制: + +1. shell command permission; +2. main 签发的短期 scoped token; +3. deny-by-default `CLI_SURFACE_V1` caller/scope policy; +4. effect policy 与 renderer-only approval; +5. ownership、rate、call/byte quota 与脱敏审计。 + +`deepchat` 不在 `SAFE_COMMANDS`。Agent 每次只能执行一个以 `deepchat ` 开头的独立 +命令;pipeline、重定向、command substitution、separator 和 newline 都会阻止 scoped token 签发。 +bundled Skill 不读取或暴露 human descriptor。 + +Agent 的管理面只开放以下批准入口:preference-only `settings set`、不带 credentials/query/fragment +的 HTTPS `skill install`,以及新增 +一个默认禁用、无凭据且可完整审阅的 HTTPS remote `mcp add` 配置。Agent MCP 输入不能包含 stdio +command、headers、authorization、非 HTTPS endpoint,或超过批准 UI 的审阅上限;批准页展示完整 +endpoint 与公共 metadata,而审计仍只记录脱敏摘要。`mcp update` 可能立即重启正在运行的服务,因此与 +MCP runtime 控制/删除、Provider/Model 配置、Skill 启停/删除、credential 和 destructive 操作一样保持 +human-only。Skill/MCP 的脱敏列表可直接读取。 + +## Coredev 入口 + +| Owner | Path | +| --- | --- | +| thin CLI、argv、输出和本地文件 I/O | `src/cli` | +| server、surface、policy、domain adapters、ArtifactSpool | `src/main/cli` | +| 唯一 composition/start/stop owner | `src/main/app/composition.ts` | +| canonical protocol 与 route contracts | `src/shared/contracts` | +| 通用批准状态机 | `src/main/approval` | +| Agent shell gate | `src/main/tool/permission/commandPermissionService.ts` | +| bundled Agent instructions | `resources/skills/deepchat-cli/SKILL.md` | + +main 只监听 UDS 或 named pipe,不开放 TCP fallback。CLI surface 引用 canonical typed contracts,但 +不是内部 route registry 的通用代理。新增能力必须显式加入 surface,并同时定义 caller、scope、 +effect、approval、transport、输入/输出边界、quota 和 audit 语义。 + +V1 明确不包含:ACP server、远程访问、raw MCP tool invocation、TUI/交互 shell、任意配置或 secret +读取、server-side OCR batch/layout/model 管理、通用费用预算系统,以及内置 benchmark runner。 +benchmark 是建立在稳定 JSON/JSONL 合同上的外部 harness。 + +完整架构与安全不变量见 +[`docs/architecture/local-control-plane/spec.md`](../architecture/local-control-plane/spec.md)。 diff --git a/electron-builder.yml b/electron-builder.yml index 43558cd258..6a05fe9ab3 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -13,6 +13,7 @@ files: - '!docs/*' - '!plugins/**' - '!out/main/lightOcrHelper.js' + - '!out/cli/**' - '!keys/*' - '!scripts/*' - '!.github/*' @@ -42,6 +43,9 @@ asarUnpack: - '**/node_modules/@arcships/light-ocr*/**/*' - '**/node_modules/@zerob13/nativekit/prebuilds/**/*' extraResources: + - from: ./out/cli/ + to: app.asar.unpacked/cli + filter: ['deepchat', 'deepchat.cmd', 'deepchat.mjs'] - from: ./runtime/ to: app.asar.unpacked/runtime filter: ['**/*'] diff --git a/package.json b/package.json index efe76f6405..6fa47cbd8d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ "dev:trace": "cross-env DEEPCHAT_VUE_DEVTOOLS_OVERLAY=0 electron-vite dev --watch", "dev:inspect": "electron-vite dev --watch --inspect=9229", "dev:linux": "electron-vite dev --watch --noSandbox", - "build": "pnpm run typecheck && electron-vite build", + "build": "pnpm run typecheck && electron-vite build && pnpm run cli:build", + "cli:build": "node scripts/build-cli.mjs", "release:ff": "node scripts/release-fast-forward.mjs", "postinstall": "electron-builder install-app-deps", "hooks:install": "git config core.hooksPath .githooks", diff --git a/resources/acp-registry/registry.json b/resources/acp-registry/registry.json index 19e8430ed5..f4b476bf73 100644 --- a/resources/acp-registry/registry.json +++ b/resources/acp-registry/registry.json @@ -818,7 +818,7 @@ { "id": "kilo", "name": "Kilo", - "version": "7.4.17", + "version": "7.4.19", "description": "The open source coding agent", "repository": "https://github.com/Kilo-Org/kilocode", "website": "https://kilo.ai/", @@ -830,48 +830,48 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.17/kilo-darwin-arm64.zip", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.19/kilo-darwin-arm64.zip", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "b51f33f7c47fb77c6252fcacfc20ba7c90a979ecd757cc9aadb246338f8c266a" + "sha256": "370f213a1ff62575e471d5c1fd96ccadb41096224f560aaa3c51d868f132f59b" }, "darwin-x86_64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.17/kilo-darwin-x64.zip", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.19/kilo-darwin-x64.zip", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "4670655e95869ff25b398d5c24b0a9c890ebef18dc23af4c6faa586c97d75cc9" + "sha256": "46b32098a5e8cf2177fb586478ae85f3a0989eed6f11d03033c0d8776e0a856d" }, "linux-aarch64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.17/kilo-linux-arm64.tar.gz", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.19/kilo-linux-arm64.tar.gz", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "b0342209411e4e16a161541e36b7d01d6972e965abea1c13c2e0eec021acfdf7" + "sha256": "48eb310f95a2778d7a25a2fada06785f1082a66a518f8e454863f4d11836e2a0" }, "linux-x86_64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.17/kilo-linux-x64.tar.gz", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.19/kilo-linux-x64.tar.gz", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "8bc8b4918c0634c185e1c54be049b4110b9e37d59f3dc93c6411d63c23b11034" + "sha256": "324de57ff82c1ff55c11903280e97ff0b7abacf1aa5acd6d2331bdb191c78f7e" }, "windows-x86_64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.17/kilo-windows-x64.zip", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.19/kilo-windows-x64.zip", "cmd": "./kilo.exe", "args": [ "acp" ], - "sha256": "4313a14a20ab3609702ab3c52e232f28aba52bbd7eb41853297ba947a452d4d2" + "sha256": "5db36446e18e1ccb592be9106c6da9342ab56c230d84d68ca268ced64873e96d" } }, "npx": { - "package": "@kilocode/cli@7.4.17", + "package": "@kilocode/cli@7.4.19", "args": [ "acp" ] @@ -970,24 +970,24 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-darwin-aarch64-2.23.3.zip", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-darwin-aarch64-2.23.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "39b1b0293e778303c4ab1be6bdeed28ab769c9eb94cea39783a475c857900f83" + "sha256": "cca5c15f20b2048c1d319892e337e8a39e2aa9f3829c9bc96d517ad6f5698846" }, "darwin-x86_64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-darwin-x86_64-2.23.3.zip", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-darwin-x86_64-2.23.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "99a89078e8ac040685aa34696b9e94b9e7ccbe1af6b978763b1552c39baec8e6" + "sha256": "fd82665d03bbc4d94713b06364b71506a3042376f49a40c25073b3b8cfeefbc7" }, "linux-aarch64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-linux-aarch64-2.23.3.zip", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-linux-aarch64-2.23.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "cad8302d8d9f5448292b6371c44fb827b3dd3027f8db0535291c81219fb46ba3" + "sha256": "eb33a1c7064745a437ad109aac26546a6a961a0212940bf9551f44dd731b4a5b" }, "linux-x86_64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-linux-x86_64-2.23.3.zip", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-linux-x86_64-2.23.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "b5f6e9e8411f32238eeecf130b18a7f0256f1b6db4afcfa8b3548d480ab42b26" + "sha256": "4166cc3457469be487897979a10d866c5c6587b32d621656f6c0b5614fce5986" }, "windows-x86_64": { "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v2.23.3/vibe-acp-windows-x86_64-2.23.3.zip", diff --git a/resources/model-db/providers.json b/resources/model-db/providers.json index c7a70ad106..10d877b8e8 100644 --- a/resources/model-db/providers.json +++ b/resources/model-db/providers.json @@ -1905,27 +1905,31 @@ } ] }, - "blueclaw": { - "id": "blueclaw", - "name": "Blue Claw", - "display_name": "Blue Claw", - "api": "https://openai.blueclaw.network/v1", - "doc": "https://blueclaw.network", + "impossibl": { + "id": "impossibl", + "name": "Impossibl", + "display_name": "Impossibl", + "api": "https://api.impossibl.com/v1", + "doc": "https://impossibl.com/docs/models", "models": [ { - "id": "Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -1937,34 +1941,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B-FP8", - "name": "Qwen3.6 35B A3B FP8", - "display_name": "Qwen3.6 35B A3B FP8", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -1976,44 +1993,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - } - ] - }, - "tencent-tokenhub": { - "id": "tencent-tokenhub", - "name": "Tencent TokenHub", - "display_name": "Tencent TokenHub", - "api": "https://tokenhub.tencentmaas.com/v1", - "doc": "https://cloud.tencent.com/document/product/1823/130050", - "models": [ + }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2026,27 +2048,32 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "hy3-preview", - "name": "Hy3 preview", - "display_name": "Hy3 preview", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2056,39 +2083,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" - } - ] - }, - "fireworks-ai": { - "id": "fireworks-ai", - "name": "Fireworks AI", - "display_name": "Fireworks AI", - "api": "https://api.fireworks.ai/inference/v1/", - "doc": "https://fireworks.ai/docs/", - "models": [ + }, { - "id": "accounts/fireworks/routers/glm-5p2-fast", - "name": "GLM 5.2 Fast", - "display_name": "GLM 5.2 Fast", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048575, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2098,37 +2135,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-26", - "last_updated": "2026-06-26", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-k2p6-fast", - "name": "Kimi K2.6 Fast", - "display_name": "Kimi K2.6 Fast", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2139,36 +2174,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-06-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-k2p6-turbo", - "name": "Kimi K2.6 Turbo", - "display_name": "Kimi K2.6 Turbo", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2179,64 +2224,85 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-k2p7-code-fast", - "name": "Kimi K2.7 Code Fast", - "display_name": "Kimi K2.7 Code Fast", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-16", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-k3-fast", - "name": "Kimi K3 Fast", - "display_name": "Kimi K3 Fast", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", @@ -2247,48 +2313,38 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-07-27", - "last_updated": "2026-07-27", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "accounts/fireworks/models/qwen3p7-plus", - "name": "Qwen 3.7 Plus", - "display_name": "Qwen 3.7 Plus", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -2296,19 +2352,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "accounts/fireworks/models/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen/qwen3.8-max-preview", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -2316,7 +2380,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -2326,26 +2390,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-06-16", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "accounts/fireworks/models/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -2355,8 +2412,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2370,26 +2427,28 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "accounts/fireworks/models/minimax-m2p7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -2408,28 +2467,29 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-12", - "last_updated": "2026-04-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "accounts/fireworks/models/kimi-k2p6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -2439,77 +2499,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, + "open_weights": false, "release_date": "2026-04-17", "last_updated": "2026-04-17", "type": "chat" }, { - "id": "accounts/fireworks/models/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 512000 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "accounts/fireworks/models/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -2519,37 +2562,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "accounts/fireworks/models/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "xai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -2559,38 +2597,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "accounts/fireworks/models/kimi-k2p7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -2598,27 +2630,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-16", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "accounts/fireworks/models/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "fireworks/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -2645,13 +2666,13 @@ "attachment": false, "open_weights": true, "release_date": "2025-08-05", - "last_updated": "2026-06-16", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "accounts/fireworks/models/glm-5p2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "fireworks/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -2661,7 +2682,7 @@ ] }, "limit": { - "context": 1048575, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -2672,39 +2693,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "accounts/fireworks/models/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "fireworks/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -2712,46 +2726,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-27", - "last_updated": "2026-07-27", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "greenpt": { - "id": "greenpt", - "name": "GreenPT", - "display_name": "GreenPT", - "api": "https://api.greenpt.ai/v1", - "doc": "https://docs.greenpt.ai", - "models": [ + }, { - "id": "mistral-medium-3.5-128b", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "groq/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -2759,27 +2757,31 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "groq/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, @@ -2790,37 +2792,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "holo2-30b-a3b", - "name": "Holo2 30B A3B", - "display_name": "Holo2 30B A3B", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 22016, - "output": 16384 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -2828,16 +2823,28 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-11", - "last_updated": "2025-11", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -2847,8 +2854,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -2858,151 +2865,243 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "green-l", - "name": "Green L", - "display_name": "Green L", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "devstral-2-123b-instruct-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3010,250 +3109,304 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "pixtral-12b-2409", - "name": "Pixtral 12B", - "display_name": "Pixtral 12B", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-09-01", - "last_updated": "2024-09-01", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "green-s", - "name": "Green S", - "display_name": "Green S", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "audio" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-01", - "last_updated": "2025-01", - "type": "chat" - }, - { - "id": "green-s-pro", - "name": "Green S Pro", - "display_name": "Green S Pro", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-02", - "last_updated": "2025-02", - "type": "chat" - }, - { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 100000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "green-r-raw", - "name": "Green R Raw", - "display_name": "Green R Raw", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gemma-3-27b-it", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40000, - "output": 8192 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", - "type": "chat" - }, - { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "voxtral-small-24b-2507", - "name": "Voxtral Small 24B", - "display_name": "Voxtral Small 24B", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "audio" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "gpt-oss-120b", + "id": "cerebras/gpt-oss-120b", "name": "GPT OSS 120B", "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -3274,29 +3427,31 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3307,16 +3462,16 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gemma4", - "name": "gemma4", - "display_name": "gemma4", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ "text", @@ -3327,36 +3482,60 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -3369,28 +3548,29 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1047576, "output": 32768 }, "temperature": true, @@ -3399,20 +3579,21 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "green-l-raw", - "name": "Green L Raw", - "display_name": "Green L Raw", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -3420,7 +3601,7 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -3428,16 +3609,16 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "kimi-k2.6-fast", - "name": "Kimi K2.6 Fast", - "display_name": "Kimi K2.6 Fast", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -3448,39 +3629,61 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3489,24 +3692,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "green-r", - "name": "Green R", - "display_name": "Green R", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", @@ -3517,34 +3733,25 @@ ] }, "limit": { - "context": 131072, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" - } - ] - }, - "wandb": { - "id": "wandb", - "name": "Weights & Biases", - "display_name": "Weights & Biases", - "api": "https://api.inference.wandb.ai/v1", - "doc": "https://docs.wandb.ai/guides/integrations/inference/", - "models": [ + }, { - "id": "microsoft/Phi-4-mini-instruct", - "name": "Phi 4 Mini 3.8B", - "display_name": "Phi 4 Mini 3.8B", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -3554,81 +3761,122 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2025-02-01", - "last_updated": "2025-02-01", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", - "name": "Nemotron 3 Super", - "display_name": "Nemotron 3 Super", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", - "name": "Nemotron 3 Ultra", - "display_name": "Nemotron 3 Ultra", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -3639,10 +3887,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3650,32 +3898,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3683,19 +3949,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", "modalities": { "input": [ "text" @@ -3705,71 +3988,93 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 16385, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "JetBrains/Mellum2-12B-A2.5B-Instruct", - "name": "Mellum2 12B A2.5B", - "display_name": "Mellum2 12B A2.5B", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "Qwen/Qwen3.5-27B", - "name": "Qwen3.5-27B", - "display_name": "Qwen3.5-27B", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3778,52 +4083,87 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B-2507", - "display_name": "Qwen3 235B A22B-2507", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B", - "name": "Qwen3.5-35B-A3B", - "display_name": "Qwen3.5-35B-A3B", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", @@ -3834,10 +4174,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3846,24 +4186,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -3874,50 +4219,63 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -3926,92 +4284,149 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-15", - "last_updated": "2026-04-15", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen3 Coder 480B A35B", - "display_name": "Qwen3 Coder 480B A35B", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3 235B A22B Thinking-2507", - "display_name": "Qwen3 235B A22B Thinking-2507", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -4020,38 +4435,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -4059,19 +4485,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -4082,97 +4525,141 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "ibm-granite/granite-4.1-8b", - "name": "Granite 4.1 8B", - "display_name": "Granite 4.1 8B", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 161000, - "output": 161000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -4181,38 +4668,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -4221,35 +4720,94 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "OpenPipe/Qwen3-14B-Instruct", - "name": "Qwen3 14B Instruct", - "display_name": "Qwen3 14B Instruct", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 1047576, "output": 32768 }, "temperature": true, @@ -4257,16 +4815,17 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", @@ -4277,10 +4836,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -4288,32 +4847,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -4332,29 +4899,27 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-02", - "last_updated": "2026-02-02", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "zai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -4362,34 +4927,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "zai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -4402,16 +4961,16 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "zai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -4421,7 +4980,7 @@ ] }, "limit": { - "context": 131072, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -4437,14 +4996,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "zai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -4454,7 +5013,7 @@ ] }, "limit": { - "context": 131072, + "context": 204800, "output": 131072 }, "temperature": true, @@ -4470,14 +5029,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "zai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -4487,25 +5047,26 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "meta-llama/Llama-3.1-8B-Instruct", - "name": "Llama 3.1 8B", - "display_name": "Llama 3.1 8B", + "id": "zai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -4515,25 +5076,37 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "meta-llama/Llama-3.1-70B-Instruct", - "name": "Llama 3.1 70B", - "display_name": "Llama 3.1 70B", + "id": "zai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -4543,46 +5116,49 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" } ] }, - "crossmodel": { - "id": "crossmodel", - "name": "CrossModel", - "display_name": "CrossModel", - "api": "https://api.crossmodel.ai/v1", - "doc": "https://www.crossmodel.ai/docs", + "blueclaw": { + "id": "blueclaw", + "name": "Blue Claw", + "display_name": "Blue Claw", + "api": "https://openai.blueclaw.network/v1", + "doc": "https://blueclaw.network", "models": [ { - "id": "gemini/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 196608, "output": 65536 }, "temperature": true, @@ -4594,46 +5170,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gemini/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "Qwen/Qwen3.6-35B-A3B-FP8", + "name": "Qwen3.6 35B A3B FP8", + "display_name": "Qwen3.6 35B A3B FP8", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 65536 }, "temperature": true, @@ -4645,48 +5209,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "tencent-tokenhub": { + "id": "tencent-tokenhub", + "name": "Tencent TokenHub", + "display_name": "Tencent TokenHub", + "api": "https://tokenhub.tencentmaas.com/v1", + "doc": "https://cloud.tencent.com/document/product/1823/130050", + "models": [ { - "id": "gemini/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -4699,31 +5259,27 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "gemini/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "hy3-preview", + "name": "Hy3 preview", + "display_name": "Hy3 preview", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -4733,48 +5289,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" - }, + } + ] + }, + "fireworks-ai": { + "id": "fireworks-ai", + "name": "Fireworks AI", + "display_name": "Fireworks AI", + "api": "https://api.fireworks.ai/inference/v1/", + "doc": "https://fireworks.ai/docs/", + "models": [ { - "id": "gemini/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "accounts/fireworks/routers/glm-5p2-fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1048575, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -4785,47 +5332,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-26", + "last_updated": "2026-06-26", "type": "chat" }, { - "id": "gemini/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "accounts/fireworks/routers/kimi-k2p6-fast", + "name": "Kimi K2.6 Fast", + "display_name": "Kimi K2.6 Fast", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -4836,45 +5372,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-06-05", "type": "chat" }, { - "id": "gemini/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "accounts/fireworks/routers/kimi-k2p6-turbo", + "name": "Kimi K2.6 Turbo", + "display_name": "Kimi K2.6 Turbo", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -4885,99 +5412,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gemini/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "accounts/fireworks/routers/kimi-k2p7-code-fast", + "name": "Kimi K2.7 Code Fast", + "display_name": "Kimi K2.7 Code Fast", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-06-12", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "accounts/fireworks/routers/kimi-k3-fast", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -4985,30 +5491,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": true, + "release_date": "2026-07-27", + "last_updated": "2026-07-27", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "accounts/fireworks/models/qwen3p7-plus", + "name": "Qwen 3.7 Plus", + "display_name": "Qwen 3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 65536 }, "temperature": true, @@ -5017,26 +5529,19 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "accounts/fireworks/models/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -5044,7 +5549,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -5063,29 +5568,28 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "accounts/fireworks/models/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -5095,26 +5599,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "accounts/fireworks/models/minimax-m2p7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -5124,8 +5621,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 196608, + "output": 196608 }, "temperature": true, "tool_call": true, @@ -5135,30 +5632,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-04-12", + "last_updated": "2026-04-12", "type": "chat" }, { - "id": "tencent/hy3-preview", - "name": "Hy3 preview", - "display_name": "Hy3 preview", + "id": "accounts/fireworks/models/kimi-k2p6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -5168,33 +5672,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "moonshot/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "accounts/fireworks/models/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 512000, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -5213,27 +5724,25 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "accounts/fireworks/models/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -5243,18 +5752,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code", + "id": "accounts/fireworks/models/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, + { + "id": "accounts/fireworks/models/kimi-k2p7-code", "name": "Kimi K2.7 Code", "display_name": "Kimi K2.7 Code", "modalities": { @@ -5270,7 +5825,7 @@ "context": 262000, "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -5278,35 +5833,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "moonshot/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "accounts/fireworks/models/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -5317,16 +5875,16 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2025-08-05", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "accounts/fireworks/models/glm-5p2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -5336,7 +5894,7 @@ ] }, "limit": { - "context": 204800, + "context": 1048575, "output": 131072 }, "temperature": true, @@ -5358,29 +5916,28 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "accounts/fireworks/models/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 512000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -5388,19 +5945,63 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-07-27", + "last_updated": "2026-07-27", + "type": "chat" + } + ] + }, + "greenpt": { + "id": "greenpt", + "name": "GreenPT", + "display_name": "GreenPT", + "api": "https://api.greenpt.ai/v1", + "doc": "https://docs.greenpt.ai", + "models": [ + { + "id": "mistral-medium-3.5-128b", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "glm-5.2-ponytail", + "name": "GLM-5.2 Ponytail", + "display_name": "GLM-5.2 Ponytail", "modalities": { "input": [ "text" @@ -5411,7 +6012,7 @@ }, "limit": { "context": 1000000, - "output": 65000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5419,39 +6020,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -5470,17 +6060,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "holo2-30b-a3b", + "name": "Holo2 30B A3B", + "display_name": "Holo2 30B A3B", "modalities": { "input": [ "text", @@ -5491,8 +6080,8 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 22016, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -5500,33 +6089,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": true, + "release_date": "2025-11", + "last_updated": "2025-11", "type": "chat" }, { - "id": "x-ai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "glm-5.2-caveman", + "name": "GLM-5.2 Caveman", + "display_name": "GLM-5.2 Caveman", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5534,33 +6117,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5573,20 +6150,19 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "glm-5.2-ponytail-ultra", + "name": "GLM-5.2 Ponytail Ultra", + "display_name": "GLM-5.2 Ponytail Ultra", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -5594,7 +6170,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5602,17 +6178,16 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -5622,26 +6197,25 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "green-l", + "name": "Green L", + "display_name": "Green L", "modalities": { "input": [ "text", @@ -5651,59 +6225,62 @@ "text" ] }, + "limit": { + "context": 128000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "type": "chat" + }, + { + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1000000, - "output": 64000 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "devstral-2-123b-instruct-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -5711,46 +6288,24 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -5761,10 +6316,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -5772,41 +6327,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "pixtral-12b-2409", + "name": "Pixtral 12B", + "display_name": "Pixtral 12B", "modalities": { "input": [ "text", @@ -5817,112 +6351,55 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2024-09-01", + "last_updated": "2024-09-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "green-s", + "name": "Green S", + "display_name": "Green S", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2025-01", + "last_updated": "2025-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "glm-5.2-caveman-ultra", + "name": "GLM-5.2 Caveman Ultra", + "display_name": "GLM-5.2 Caveman Ultra", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -5930,34 +6407,27 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "glm-5.2-ponytail-lite", + "name": "GLM-5.2 Ponytail Lite", + "display_name": "GLM-5.2 Ponytail Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -5965,30 +6435,51 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "green-s-pro", + "name": "Green S Pro", + "display_name": "Green S Pro", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2025-02", + "last_updated": "2025-02", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -5998,8 +6489,37 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 100000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "green-r-raw", + "name": "Green R Raw", + "display_name": "Green R Raw", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -6007,27 +6527,45 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": true, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + }, + { + "id": "gemma-3-27b-it", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] }, - "attachment": false, + "limit": { + "context": 40000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -6037,8 +6575,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -6053,14 +6591,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "glm-5.2-honey-ultra", + "name": "GLM-5.2 Honey Ultra", + "display_name": "GLM-5.2 Honey Ultra", "modalities": { "input": [ "text" @@ -6071,7 +6610,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -6079,11 +6618,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, "release_date": "2026-06-13", @@ -6091,9 +6625,9 @@ "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -6103,37 +6637,25 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "glm-5.2-honey", + "name": "GLM-5.2 Honey", + "display_name": "GLM-5.2 Honey", "modalities": { "input": [ "text" @@ -6143,8 +6665,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -6152,56 +6674,45 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "voxtral-small-24b-2507", + "name": "Voxtral Small 24B", + "display_name": "Voxtral Small 24B", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text", @@ -6212,10 +6723,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -6223,52 +6734,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -6276,36 +6767,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "gemma4", + "name": "gemma4", + "display_name": "gemma4", "modalities": { "input": [ "text", @@ -6316,77 +6790,59 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", @@ -6397,48 +6853,25 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "green-l-raw", + "name": "Green L Raw", + "display_name": "Green L Raw", "modalities": { "input": [ "text", @@ -6449,48 +6882,25 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "kimi-k2.6-fast", + "name": "Kimi K2.6 Fast", + "display_name": "Kimi K2.6 Fast", "modalities": { "input": [ "text", @@ -6501,49 +6911,26 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -6554,8 +6941,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -6565,47 +6952,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - } - ] - }, - "llmtr": { - "id": "llmtr", - "name": "LLMTR", - "display_name": "LLMTR", - "api": "https://llmtr.com/v1", - "doc": "https://llmtr.com/docs", - "models": [ + }, { - "id": "sincap", - "name": "Sincap", - "display_name": "Sincap", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text" @@ -6615,52 +6974,64 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-05", - "last_updated": "2026-05-05", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "medgemma-4b", - "name": "MedGemma 4B", - "display_name": "MedGemma 4B", + "id": "glm-5.2-honey-lite", + "name": "GLM-5.2 Honey Lite", + "display_name": "GLM-5.2 Honey Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-26", - "last_updated": "2026-04-26", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "magibu-11b-v8", - "name": "Magibu 11B v8", - "display_name": "Magibu 11B v8", + "id": "glm-5.2-caveman-lite", + "name": "GLM-5.2 Caveman Lite", + "display_name": "GLM-5.2 Caveman Lite", "modalities": { "input": [ "text" @@ -6670,38 +7041,37 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-06-05", - "last_updated": "2026-06-05", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3-6-35b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "green-r", + "name": "Green R", + "display_name": "Green R", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -6711,14 +7081,23 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "wandb": { + "id": "wandb", + "name": "Weights & Biases", + "display_name": "Weights & Biases", + "api": "https://api.inference.wandb.ai/v1", + "doc": "https://docs.wandb.ai/guides/integrations/inference/", + "models": [ { - "id": "trendyol-7b", - "name": "Trendyol 7B", - "display_name": "Trendyol 7B", + "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "name": "Nemotron 3 Super", + "display_name": "Nemotron 3 Super", "modalities": { "input": [ "text" @@ -6728,24 +7107,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-06-06", - "last_updated": "2026-06-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "gemma-4", - "name": "Gemma 4", - "display_name": "Gemma 4", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "name": "Nemotron 3 Ultra", + "display_name": "Nemotron 3 Ultra", "modalities": { "input": [ "text" @@ -6755,291 +7135,206 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" - } - ] - }, - "claudinio": { - "id": "claudinio", - "name": "Claudinio", - "display_name": "Claudinio", - "api": "https://api.claudin.io/v1", - "doc": "https://claudin.io", - "models": [ - { - "id": "claudinio", - "name": "Claudinio", - "display_name": "Claudinio", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 64000 - }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-05-12", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "claudius", - "name": "Claudius", - "display_name": "Claudius", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 262144, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - } - ] - }, - "snowflake-cortex": { - "id": "snowflake-cortex", - "name": "Snowflake Cortex", - "display_name": "Snowflake Cortex", - "api": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", - "doc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", - "models": [ + }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "zai-org/GLM-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "openai-gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "zai-org/GLM-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 202752, + "output": 202752 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "openai-gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "JetBrains/Mellum2-12B-A2.5B-Instruct", + "name": "Mellum2 12B A2.5B", + "display_name": "Mellum2 12B A2.5B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "Qwen/Qwen3.5-35B-A3B", + "name": "Qwen3.5-35B-A3B", + "display_name": "Qwen3.5-35B-A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -7048,55 +7343,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gemini-3.1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -7107,292 +7383,234 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-04-15", + "last_updated": "2026-04-15", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "openai-gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3 Coder 480B A35B", + "display_name": "Qwen3 Coder 480B A35B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "openai-gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 196608, + "output": 196608 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai-gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "ibm-granite/granite-4.1-8b", + "name": "Granite 4.1 8B", + "display_name": "Granite 4.1 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 8192 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "openai-gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai-gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 161000, + "output": 161000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -7402,8 +7620,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -7424,287 +7642,252 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai-gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "mistral-large2", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "OpenPipe/Qwen3-14B-Instruct", + "name": "Qwen3 14B Instruct", + "display_name": "Qwen3 14B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "snowflake-llama3.3-70b", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai-gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai-gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "openai/gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai-gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "openai/gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" - } - ] - }, - "cohere": { - "id": "cohere", - "name": "Cohere", - "display_name": "Cohere", - "doc": "https://docs.cohere.com/docs/models", - "models": [ - { - "id": "command-r7b-arabic-02-2025", - "name": "Command R7B Arabic", - "display_name": "Command R7B Arabic", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "command-r-08-2024", - "name": "Command R", - "display_name": "Command R", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ "text" @@ -7715,7 +7898,7 @@ }, "limit": { "context": 128000, - "output": 4000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -7724,50 +7907,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", - "type": "chat" - }, - { - "id": "command-a-plus-05-2026", - "name": "Command A Plus", - "display_name": "Command A Plus", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04-01", - "release_date": "2026-05-20", - "last_updated": "2026-06-09", + "knowledge": "2023-12", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "command-a-translate-08-2025", - "name": "Command A Translate", - "display_name": "Command A Translate", + "id": "meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B", + "display_name": "Llama 3.1 8B", "modalities": { "input": [ "text" @@ -7777,8 +7925,8 @@ ] }, "limit": { - "context": 8000, - "output": 8000 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -7787,15 +7935,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "c4ai-aya-expanse-8b", - "name": "Aya Expanse 8B", - "display_name": "Aya Expanse 8B", + "id": "meta-llama/Llama-3.1-70B-Instruct", + "name": "Llama 3.1 70B", + "display_name": "Llama 3.1 70B", "modalities": { "input": [ "text" @@ -7805,119 +7953,187 @@ ] }, "limit": { - "context": 8000, - "output": 4000 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-10-24", - "last_updated": "2024-10-24", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" - }, + } + ] + }, + "crossmodel": { + "id": "crossmodel", + "name": "CrossModel", + "display_name": "CrossModel", + "api": "https://api.crossmodel.ai/v1", + "doc": "https://www.crossmodel.ai/docs", + "models": [ { - "id": "c4ai-aya-vision-32b", - "name": "Aya Vision 32B", - "display_name": "Aya Vision 32B", + "id": "gemini/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-04", - "last_updated": "2025-05-14", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "command-a-03-2025", - "name": "Command A", - "display_name": "Command A", + "id": "gemini/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "command-r-plus-08-2024", - "name": "Command R+", - "display_name": "Command R+", + "id": "gemini/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "command-a-reasoning-08-2025", - "name": "Command A Reasoning", - "display_name": "Command A Reasoning", + "id": "gemini/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -7925,176 +8141,271 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "command-a-vision-07-2025", - "name": "Command A Vision", - "display_name": "Command A Vision", + "id": "gemini/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "command-r7b-12-2024", - "name": "Command R7B", - "display_name": "Command R7B", + "id": "gemini/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-02", - "last_updated": "2024-12-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "c4ai-aya-vision-8b", - "name": "Aya Vision 8B", - "display_name": "Aya Vision 8B", + "id": "gemini/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-04", - "last_updated": "2025-05-14", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "north-mini-code-1-0", - "name": "North Mini Code", - "display_name": "North Mini Code", + "id": "gemini/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09-23", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "c4ai-aya-expanse-32b", - "name": "Aya Expanse 32B", - "display_name": "Aya Expanse 32B", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-10-24", - "last_updated": "2024-10-24", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" - } - ] - }, - "opencode-go": { - "id": "opencode-go", - "name": "OpenCode Go", - "display_name": "OpenCode Go", - "api": "https://opencode.ai/zen/go/v1", - "doc": "https://opencode.ai/docs/zen", - "models": [ + }, { - "id": "qwen3.7-plus", + "id": "qwen/qwen3.7-plus", "name": "Qwen3.7 Plus", "display_name": "Qwen3.7 Plus", "modalities": { @@ -8109,7 +8420,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -8124,14 +8435,15 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-04", "release_date": "2026-06-02", "last_updated": "2026-06-02", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -8141,8 +8453,8 @@ ] }, "limit": { - "context": 202752, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -8152,26 +8464,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", @@ -8183,8 +8488,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -8194,37 +8499,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -8243,31 +8543,29 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "mimo-v2-omni", - "name": "MiMo V2 Omni", - "display_name": "MiMo V2 Omni", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -8287,16 +8585,16 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash (New)", - "display_name": "DeepSeek V4 Flash (New)", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -8306,8 +8604,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -8317,31 +8615,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "tencent/hy3-preview", + "name": "Hy3 preview", + "display_name": "Hy3 preview", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -8349,7 +8638,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -8359,39 +8648,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "moonshot/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262000, + "output": 262000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -8408,28 +8691,29 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -8439,38 +8723,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262000, + "output": 262000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -8481,16 +8761,17 @@ "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -8502,10 +8783,10 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -8513,26 +8794,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mimo-v2-pro", - "name": "MiMo V2 Pro", - "display_name": "MiMo V2 Pro", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -8542,8 +8816,8 @@ ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -8562,15 +8836,14 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", "release_date": "2026-03-18", "last_updated": "2026-03-18", "type": "chat" }, { - "id": "minimax-m3", + "id": "minimax/minimax-m3", "name": "MiniMax-M3", "display_name": "MiniMax-M3", "modalities": { @@ -8584,8 +8857,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1024000, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -8598,17 +8871,16 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-05-31", - "last_updated": "2026-05-31", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -8618,8 +8890,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -8629,17 +8901,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek-v4-pro", + "id": "deepseek/deepseek-v4-pro", "name": "DeepSeek V4 Pro", "display_name": "DeepSeek V4 Pro", "modalities": { @@ -8652,7 +8931,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 65000 }, "temperature": true, "tool_call": true, @@ -8679,15 +8958,13 @@ "type": "chat" }, { - "id": "mimo-v2.5", - "name": "MiMo V2.5", - "display_name": "MiMo V2.5", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -8695,7 +8972,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -8705,37 +8982,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 65536 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -8748,32 +9019,30 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna (2x usage)", - "display_name": "GPT-5.6 Luna (2x usage)", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -8781,38 +9050,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", @@ -8823,8 +9073,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -8832,149 +9082,159 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ] + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -8982,9 +9242,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -8993,62 +9253,96 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" - } - ] - }, - "poe": { - "id": "poe", - "name": "Poe", - "display_name": "Poe", - "api": "https://api.poe.com/v1", - "doc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", - "models": [ + }, { - "id": "stabilityai/stablediffusionxl", - "name": "StableDiffusionXL", - "display_name": "StableDiffusionXL", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 200, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2023-07-09", - "last_updated": "2023-07-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "fireworks-ai/kimi-k2.5-fw", - "name": "Kimi-K2.5-FW", - "display_name": "Kimi-K2.5-FW", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -9059,93 +9353,135 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "topazlabs-co/topazlabs", - "name": "TopazLabs", - "display_name": "TopazLabs", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 204, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "google/imagen-4-fast", - "name": "Imagen-4-Fast", - "display_name": "Imagen-4-Fast", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-25", - "last_updated": "2025-06-25", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini-3.5-Flash", - "display_name": "Gemini-3.5-Flash", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -9154,49 +9490,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini-2.5-Flash", - "display_name": "Gemini-2.5-Flash", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1065535, - "output": 65535 + "context": 200000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -9204,77 +9528,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-26", - "last_updated": "2025-04-26", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "google/imagen-3", - "name": "Imagen-3", - "display_name": "Imagen-3", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-10-15", - "last_updated": "2024-10-15", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "google/gemini-3.1-pro", - "name": "Gemini-3.1-Pro", - "display_name": "Gemini-3.1-Pro", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -9283,98 +9595,105 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "google/veo-3", - "name": "Veo-3", - "display_name": "Veo-3", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 200000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-05-21", - "last_updated": "2025-05-21", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "google/imagen-4-ultra", - "name": "Imagen-4-Ultra", - "display_name": "Imagen-4-Ultra", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-24", - "last_updated": "2025-05-24", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "google/gemini-3-flash", - "name": "Gemini-3-Flash", - "display_name": "Gemini-3-Flash", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -9386,116 +9705,168 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-07", - "last_updated": "2025-10-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/veo-3.1-fast", - "name": "Veo-3.1-Fast", - "display_name": "Veo-3.1-Fast", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "google/veo-3-fast", - "name": "Veo-3-Fast", - "display_name": "Veo-3-Fast", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-10-13", - "last_updated": "2025-10-13", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "google/gemini-deep-research", - "name": "gemini-deep-research", - "display_name": "gemini-deep-research", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "google/gemma-4-31b", - "name": "Gemma-4-31B", - "display_name": "Gemma-4-31B", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -9506,213 +9877,297 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "google/gemini-3-pro", - "name": "Gemini-3-Pro", - "display_name": "Gemini-3-Pro", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-22", - "last_updated": "2025-10-22", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "google/imagen-3-fast", - "name": "Imagen-3-Fast", - "display_name": "Imagen-3-Fast", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2024-10-17", - "last_updated": "2024-10-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/veo-2", - "name": "Veo-2", - "display_name": "Veo-2", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2024-12-02", - "last_updated": "2024-12-02", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "llmtr": { + "id": "llmtr", + "name": "LLMTR", + "display_name": "LLMTR", + "api": "https://llmtr.com/v1", + "doc": "https://llmtr.com/docs", + "models": [ { - "id": "google/nano-banana-pro", - "name": "Nano-Banana-Pro", - "display_name": "Nano-Banana-Pro", + "id": "sincap", + "name": "Sincap", + "display_name": "Sincap", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 65536, + "context": 128000, "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "release_date": "2026-05-05", + "last_updated": "2026-05-05", "type": "chat" }, { - "id": "google/gemini-2.0-flash", - "name": "Gemini-2.0-Flash", - "display_name": "Gemini-2.0-Flash", + "id": "medgemma-4b", + "name": "MedGemma 4B", + "display_name": "MedGemma 4B", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 990000, - "output": 8192 + "context": 8192, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": true, + "release_date": "2026-04-26", + "last_updated": "2026-04-26", "type": "chat" }, { - "id": "google/nano-banana", - "name": "Nano-Banana", - "display_name": "Nano-Banana", + "id": "magibu-11b-v8", + "name": "Magibu 11B v8", + "display_name": "Magibu 11B v8", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 8192, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2026-06-05", + "last_updated": "2026-06-05", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini-3.1-Flash-Lite", - "display_name": "Gemini-3.1-Flash-Lite", + "id": "qwen3-6-35b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -9725,150 +10180,174 @@ ] }, "limit": { - "context": 1048576, + "context": 16384, "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "google/imagen-4", - "name": "Imagen-4", - "display_name": "Imagen-4", + "id": "trendyol-7b", + "name": "Trendyol 7B", + "display_name": "Trendyol 7B", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, + "context": 32768, "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-06", + "last_updated": "2026-06-06", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini-2.5-Pro", - "display_name": "Gemini-2.5-Pro", + "id": "gemma-4", + "name": "Gemma 4", + "display_name": "Gemma 4", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + } + ] + }, + "claudinio": { + "id": "claudinio", + "name": "Claudinio", + "display_name": "Claudinio", + "api": "https://api.claudin.io/v1", + "doc": "https://claudin.io", + "models": [ + { + "id": "claudinio", + "name": "Claudinio", + "display_name": "Claudinio", "modalities": { "input": [ "text", "image", - "video", - "audio" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1065535, - "output": 65535 + "context": 256000, + "output": 64000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2025-02-05", + "knowledge": "2026-05", + "release_date": "2026-05-12", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "google/veo-3.1", - "name": "Veo-3.1", - "display_name": "Veo-3.1", + "id": "claudius", + "name": "Claudius", + "display_name": "Claudius", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 256000, + "output": 64000 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2026-05", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" - }, + } + ] + }, + "snowflake-cortex": { + "id": "snowflake-cortex", + "name": "Snowflake Cortex", + "display_name": "Snowflake Cortex", + "api": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "doc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "models": [ { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini-2.5-Flash-Lite", - "display_name": "Gemini-2.5-Flash-Lite", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 1000000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -9878,314 +10357,431 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, + "min": 1024, "unit": "tokens" }, - "summaries": true, - "visibility": "summary", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-19", - "last_updated": "2025-06-19", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemini-2.0-flash-lite", - "name": "Gemini-2.0-Flash-Lite", - "display_name": "Gemini-2.0-Flash-Lite", + "id": "openai-gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 990000, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2025-02-05", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/lyria", - "name": "Lyria", - "display_name": "Lyria", + "id": "openai-gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-06-04", - "last_updated": "2025-06-04", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "poetools/claude-code", - "name": "claude-code", - "display_name": "claude-code", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-27", - "last_updated": "2025-11-27", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "ideogramai/ideogram-v2", - "name": "Ideogram-v2", - "display_name": "Ideogram-v2", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "image" - ] - }, - "limit": { - "context": 150, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2024-08-21", - "last_updated": "2024-08-21", - "type": "chat" - }, - { - "id": "ideogramai/ideogram-v2a", - "name": "Ideogram-v2a", - "display_name": "Ideogram-v2a", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 150, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "ideogramai/ideogram", - "name": "Ideogram", - "display_name": "Ideogram", + "id": "gemini-3.1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 150, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-04-03", - "last_updated": "2024-04-03", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "ideogramai/ideogram-v2a-turbo", - "name": "Ideogram-v2a-Turbo", - "display_name": "Ideogram-v2a-Turbo", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 150, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "empiriolabs/deepseek-v4-flash-el", - "name": "DeepSeek-V4-Flash-EL", - "display_name": "DeepSeek-V4-Flash-EL", + "id": "openai-gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-24", - "last_updated": "2026-05-02", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "empiriolabs/deepseek-v4-pro-el", - "name": "DeepSeek-V4-Pro-EL", - "display_name": "DeepSeek-V4-Pro-EL", + "id": "openai-gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-24", - "last_updated": "2026-05-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "xai/grok-4", - "name": "Grok-4", - "display_name": "Grok-4", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 200000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-10", - "last_updated": "2025-07-10", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "xai/grok-4.1-fast-reasoning", - "name": "Grok-4.1-Fast-Reasoning", - "display_name": "Grok-4.1-Fast-Reasoning", + "id": "openai-gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -10196,8 +10792,8 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 272000, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -10207,42 +10803,46 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "xai/grok-4.20-multi-agent", - "name": "Grok-4.20-Multi-Agent", - "display_name": "Grok-4.20-Multi-Agent", + "id": "openai-gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-03-13", - "last_updated": "2026-03-13", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "xai/grok-4-fast-reasoning", - "name": "Grok-4-Fast-Reasoning", - "display_name": "Grok-4-Fast-Reasoning", + "id": "openai-gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -10253,7 +10853,7 @@ ] }, "limit": { - "context": 2000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -10262,21 +10862,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-09-16", - "last_updated": "2025-09-16", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "xai/grok-code-fast-1", - "name": "Grok Code Fast 1", - "display_name": "Grok Code Fast 1", + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ "text" @@ -10286,10 +10882,10 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -10297,47 +10893,57 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-22", - "last_updated": "2025-08-22", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "xai/grok-4-fast-non-reasoning", - "name": "Grok-4-Fast-Non-Reasoning", - "display_name": "Grok-4-Fast-Non-Reasoning", + "id": "openai-gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-09-16", - "last_updated": "2025-09-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "xai/grok-4.1-fast-non-reasoning", - "name": "Grok-4.1-Fast-Non-Reasoning", - "display_name": "Grok-4.1-Fast-Non-Reasoning", + "id": "mistral-large2", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", @@ -10348,52 +10954,82 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "xai/grok-3-mini", - "name": "Grok 3 Mini", - "display_name": "Grok 3 Mini", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-11", - "last_updated": "2025-04-11", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "xai/grok-3", - "name": "Grok 3", - "display_name": "Grok 3", + "id": "snowflake-llama3.3-70b", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -10403,768 +11039,706 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-11", - "last_updated": "2025-04-11", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "lumalabs/ray2", - "name": "Ray2", - "display_name": "Ray2", + "id": "openai-gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 5000, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-02-20", - "last_updated": "2025-02-20", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "trytako/tako", - "name": "Tako", - "display_name": "Tako", + "id": "openai-gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 2048, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2024-08-15", - "last_updated": "2024-08-15", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "runwayml/runway-gen-4-turbo", - "name": "Runway-Gen-4-Turbo", - "display_name": "Runway-Gen-4-Turbo", + "id": "openai-gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 256, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-05-09", - "last_updated": "2025-05-09", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" - }, + } + ] + }, + "cohere": { + "id": "cohere", + "name": "Cohere", + "display_name": "Cohere", + "doc": "https://docs.cohere.com/docs/models", + "models": [ { - "id": "runwayml/runway", - "name": "Runway", - "display_name": "Runway", + "id": "command-r7b-arabic-02-2025", + "name": "Command R7B Arabic", + "display_name": "Command R7B Arabic", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 256, - "output": 8192 + "context": 128000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-10-11", - "last_updated": "2024-10-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-02-27", + "last_updated": "2025-02-27", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude-Sonnet-4.6", - "display_name": "Claude-Sonnet-4.6", + "id": "command-r-08-2024", + "name": "Command R", + "display_name": "Command R", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983040, - "output": 128000 + "context": 128000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude-Opus-4.1", - "display_name": "Claude-Opus-4.1", + "id": "command-a-plus-05-2026", + "name": "Command A Plus", + "display_name": "Command A Plus", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 32000 + "context": 128000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "knowledge": "2025-04-01", + "release_date": "2026-05-20", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude-Opus-4.5", - "display_name": "Claude-Opus-4.5", + "id": "command-a-translate-08-2025", + "name": "Command A Translate", + "display_name": "Command A Translate", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 64000 + "context": 8000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-21", - "last_updated": "2025-11-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude-Opus-4.7", - "display_name": "Claude-Opus-4.7", + "id": "c4ai-aya-expanse-8b", + "name": "Aya Expanse 8B", + "display_name": "Aya Expanse 8B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 8000, + "output": 4000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-15", - "last_updated": "2026-04-15", + "attachment": false, + "open_weights": true, + "release_date": "2024-10-24", + "last_updated": "2024-10-24", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude-Sonnet-4.5", - "display_name": "Claude-Sonnet-4.5", + "id": "c4ai-aya-vision-32b", + "name": "Aya Vision 32B", + "display_name": "Aya Vision 32B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 983040, - "output": 32768 + "context": 16000, + "output": 4000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "open_weights": true, + "release_date": "2025-03-04", + "last_updated": "2025-05-14", "type": "chat" }, { - "id": "anthropic/claude-sonnet-3.5", - "name": "Claude-Sonnet-3.5", - "display_name": "Claude-Sonnet-3.5", + "id": "command-a-03-2025", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 256000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-06-05", - "last_updated": "2024-06-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "anthropic/claude-haiku-3.5", - "name": "Claude-Haiku-3.5", - "display_name": "Claude-Haiku-3.5", + "id": "command-r-plus-08-2024", + "name": "Command R+", + "display_name": "Command R+", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 128000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4", - "name": "Claude-Sonnet-4", - "display_name": "Claude-Sonnet-4", + "id": "command-a-reasoning-08-2025", + "name": "Command A Reasoning", + "display_name": "Command A Reasoning", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983040, - "output": 64000 + "context": 256000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-21", - "last_updated": "2025-05-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude-Haiku-4.5", - "display_name": "Claude-Haiku-4.5", + "id": "command-a-vision-07-2025", + "name": "Command A Vision", + "display_name": "Command A Vision", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 192000, - "output": 64000 + "context": 128000, + "output": 8000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", + "type": "chat" + }, + { + "id": "command-r7b-12-2024", + "name": "Command R7B", + "display_name": "Command R7B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-12-02", + "last_updated": "2024-12-02", + "type": "chat" + }, + { + "id": "c4ai-aya-vision-8b", + "name": "Aya Vision 8B", + "display_name": "Aya Vision 8B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16000, + "output": 4000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-03-04", + "last_updated": "2025-05-14", + "type": "chat" + }, + { + "id": "north-mini-code-1-0", + "name": "North Mini Code", + "display_name": "North Mini Code", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09-23", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-3.7", - "name": "Claude-Sonnet-3.7", - "display_name": "Claude-Sonnet-3.7", + "id": "c4ai-aya-expanse-32b", + "name": "Aya Expanse 32B", + "display_name": "Aya Expanse 32B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 128000 + "context": 128000, + "output": 4000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2024-10-24", + "last_updated": "2024-10-24", "type": "chat" - }, + } + ] + }, + "opencode-go": { + "id": "opencode-go", + "name": "OpenCode Go", + "display_name": "OpenCode Go", + "api": "https://opencode.ai/zen/go/v1", + "doc": "https://opencode.ai/docs/zen", + "models": [ { - "id": "anthropic/claude-sonnet-3.5-june", - "name": "Claude-Sonnet-3.5-June", - "display_name": "Claude-Sonnet-3.5-June", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2024-11-18", - "last_updated": "2024-11-18", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "anthropic/claude-opus-4", - "name": "Claude-Opus-4", - "display_name": "Claude-Opus-4", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 192512, - "output": 28672 + "context": 202752, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-21", - "last_updated": "2025-05-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude-Opus-4.8", - "display_name": "Claude-Opus-4.8", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "anthropic/claude-haiku-3", - "name": "Claude-Haiku-3", - "display_name": "Claude-Haiku-3", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 202752, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-03-09", - "last_updated": "2024-03-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude-Opus-4.6", - "display_name": "Claude-Opus-4.6", + "id": "mimo-v2-omni", + "name": "MiMo V2 Omni", + "display_name": "MiMo V2 Omni", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -11172,53 +11746,37 @@ ] }, "limit": { - "context": 983040, + "context": 262144, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-04", - "last_updated": "2026-02-04", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "cerebras/qwen3-235b-2507-cs", - "name": "qwen3-235b-2507-cs", - "display_name": "qwen3-235b-2507-cs", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash (New)", + "display_name": "DeepSeek V4 Flash (New)", "modalities": { "input": [ "text" @@ -11228,52 +11786,79 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-06", - "last_updated": "2025-08-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "cerebras/llama-3.1-8b-cs", - "name": "Llama-3.1-8B-CS", - "display_name": "Llama-3.1-8B-CS", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-13", - "last_updated": "2025-05-13", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "cerebras/qwen3-32b-cs", - "name": "qwen3-32b-cs", - "display_name": "qwen3-32b-cs", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -11283,25 +11868,37 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-15", - "last_updated": "2025-05-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "cerebras/gpt-oss-120b-cs", - "name": "GPT-OSS-120B-CS", - "display_name": "GPT-OSS-120B-CS", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -11311,25 +11908,36 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-06", - "last_updated": "2025-08-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "cerebras/llama-3.3-70b-cs", - "name": "llama-3.3-70b-cs", - "display_name": "llama-3.3-70b-cs", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -11339,115 +11947,127 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-05-13", - "last_updated": "2025-05-13", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1-Codex-Mini", - "display_name": "GPT-5.1-Codex-Mini", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "openai/gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", + "id": "mimo-v2-pro", + "name": "MiMo V2 Pro", + "display_name": "MiMo V2 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2-Pro", - "display_name": "GPT-5.2-Pro", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -11455,49 +12075,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-05-31", + "last_updated": "2026-05-31", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5-Pro", - "display_name": "GPT-5.5-Pro", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -11508,140 +12112,181 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1-mini", - "display_name": "GPT-4.1-mini", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/sora-2-pro", - "name": "Sora-2-Pro", - "display_name": "Sora-2-Pro", + "id": "mimo-v2.5", + "name": "MiMo V2.5", + "display_name": "MiMo V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-5-chat", - "name": "GPT-5-Chat", - "display_name": "GPT-5-Chat", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 204800, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-5.3-codex-spark", - "name": "GPT-5.3-Codex-Spark", - "display_name": "GPT-5.3-Codex-Spark", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna (2x usage)", + "display_name": "GPT-5.6 Luna (2x usage)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -11656,10 +12301,12 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -11672,14 +12319,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-04", - "last_updated": "2026-03-04", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-4o-aug", - "name": "GPT-4o-Aug", - "display_name": "GPT-4o-Aug", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -11690,36 +12338,43 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2024-11-21", - "last_updated": "2024-11-21", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4-Pro", - "display_name": "GPT-5.4-Pro", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -11730,45 +12385,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/o3-mini-high", - "name": "o3-mini-high", - "display_name": "o3-mini-high", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -11779,93 +12427,126 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1-nano", - "display_name": "GPT-4.1-nano", + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-4o-search", - "name": "GPT-4o-Search", - "display_name": "GPT-4o-Search", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-11", - "last_updated": "2025-03-11", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "poe": { + "id": "poe", + "name": "Poe", + "display_name": "Poe", + "api": "https://api.poe.com/v1", + "doc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "models": [ { - "id": "openai/chatgpt-4o-latest", - "name": "ChatGPT-4o-Latest", - "display_name": "ChatGPT-4o-Latest", + "id": "stabilityai/stablediffusionxl", + "name": "StableDiffusionXL", + "display_name": "StableDiffusionXL", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, + "context": 200, "output": 8192 }, "temperature": false, @@ -11875,14 +12556,14 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-08-14", - "last_updated": "2024-08-14", + "release_date": "2023-07-09", + "last_updated": "2023-07-09", "type": "chat" }, { - "id": "openai/gpt-5.1-instant", - "name": "GPT-5.1-Instant", - "display_name": "GPT-5.1-Instant", + "id": "fireworks-ai/kimi-k2.5-fw", + "name": "Kimi-K2.5-FW", + "display_name": "Kimi-K2.5-FW", "modalities": { "input": [ "text", @@ -11893,58 +12574,91 @@ ] }, "limit": { - "context": 128000, + "context": 262144, "output": 16384 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "topazlabs-co/topazlabs", + "name": "TopazLabs", + "display_name": "TopazLabs", "modalities": { "input": [ - "text", + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 204, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "google/imagen-4-fast", + "name": "Imagen-4-Fast", + "display_name": "Imagen-4-Fast", + "modalities": { + "input": [ + "text" + ], + "output": [ "image" + ] + }, + "limit": { + "context": 480, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-06-25", + "last_updated": "2025-06-25", + "type": "chat" + }, + { + "id": "google/gemini-3.5-flash", + "name": "Gemini-3.5-Flash", + "display_name": "Gemini-3.5-Flash", + "modalities": { + "input": [ + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -11956,65 +12670,93 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai/gpt-4-classic", - "name": "GPT-4-Classic", - "display_name": "GPT-4-Classic", + "id": "google/gemini-2.5-flash", + "name": "Gemini-2.5-Flash", + "display_name": "Gemini-2.5-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1065535, + "output": 65535 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-03-25", - "last_updated": "2024-03-25", + "release_date": "2025-04-26", + "last_updated": "2025-04-26", "type": "chat" }, { - "id": "openai/gpt-image-1-mini", - "name": "GPT-Image-1-Mini", - "display_name": "GPT-Image-1-Mini", + "id": "google/imagen-3", + "name": "Imagen-3", + "display_name": "Imagen-3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "image" ] }, "limit": { - "context": 8192, + "context": 480, "output": 8192 }, "temperature": false, @@ -12024,27 +12766,28 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", - "type": "imageGeneration" + "release_date": "2024-10-15", + "last_updated": "2024-10-15", + "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "google/gemini-3.1-pro", + "name": "Gemini-3.1-Pro", + "display_name": "Gemini-3.1-Pro", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -12056,46 +12799,67 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "openai/gpt-5.3-instant", - "name": "GPT-5.3-Instant", - "display_name": "GPT-5.3-Instant", + "id": "google/veo-3", + "name": "Veo-3", + "display_name": "Veo-3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ + "video" + ] + }, + "limit": { + "context": 480, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-21", + "last_updated": "2025-05-21", + "type": "chat" + }, + { + "id": "google/imagen-4-ultra", + "name": "Imagen-4-Ultra", + "display_name": "Imagen-4-Ultra", + "modalities": { + "input": [ "text" + ], + "output": [ + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -12104,26 +12868,28 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2025-05-24", + "last_updated": "2025-05-24", "type": "chat" }, { - "id": "openai/o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "google/gemini-3-flash", + "name": "Gemini-3-Flash", + "display_name": "Gemini-3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -12135,38 +12901,43 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "release_date": "2025-10-07", + "last_updated": "2025-10-07", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o-mini", - "display_name": "GPT-4o-mini", + "id": "google/veo-3.1-fast", + "name": "Veo-3.1-Fast", + "display_name": "Veo-3.1-Fast", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 124096, - "output": 4096 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -12175,144 +12946,113 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "google/veo-3-fast", + "name": "Veo-3-Fast", + "display_name": "Veo-3-Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-10-13", + "last_updated": "2025-10-13", "type": "chat" }, { - "id": "openai/dall-e-3", - "name": "DALL-E-3", - "display_name": "DALL-E-3", + "id": "google/gemini-deep-research", + "name": "gemini-deep-research", + "display_name": "gemini-deep-research", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 800, + "context": 1048576, "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2023-11-06", - "type": "imageGeneration" + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "type": "chat" }, { - "id": "openai/o4-mini-deep-research", - "name": "o4-mini-deep-research", - "display_name": "o4-mini-deep-research", + "id": "google/gemma-4-31b", + "name": "Gemma-4-31B", + "display_name": "Gemma-4-31B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/o3-deep-research", - "name": "o3-deep-research", - "display_name": "o3-deep-research", + "id": "google/gemini-3-pro", + "name": "Gemini-3-Pro", + "display_name": "Gemini-3-Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -12324,88 +13064,67 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "release_date": "2025-10-22", + "last_updated": "2025-10-22", "type": "chat" }, { - "id": "openai/gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "google/imagen-3-fast", + "name": "Imagen-3-Fast", + "display_name": "Imagen-3-Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2024-10-17", + "last_updated": "2024-10-17", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5-Turbo", - "display_name": "GPT-3.5-Turbo", + "id": "google/veo-2", + "name": "Veo-2", + "display_name": "Veo-2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 16384, - "output": 2048 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -12414,78 +13133,56 @@ }, "attachment": true, "open_weights": false, - "release_date": "2023-09-13", - "last_updated": "2023-09-13", + "release_date": "2024-12-02", + "last_updated": "2024-12-02", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "google/nano-banana-pro", + "name": "Nano-Banana-Pro", + "display_name": "Nano-Banana-Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-02-26", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "openai/gpt-4-classic-0314", - "name": "GPT-4-Classic-0314", - "display_name": "GPT-4-Classic-0314", + "id": "google/gemini-2.0-flash", + "name": "Gemini-2.0-Flash", + "display_name": "Gemini-2.0-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 990000, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -12494,54 +13191,57 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-08-26", - "last_updated": "2024-08-26", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "openai/gpt-image-1.5", - "name": "gpt-image-1.5", - "display_name": "gpt-image-1.5", + "id": "google/nano-banana", + "name": "Nano-Banana", + "display_name": "Nano-Banana", "modalities": { "input": [ "text", "image" ], "output": [ + "text", "image" ] }, "limit": { - "context": 128000, + "context": 65536, "output": 8192 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16", - "type": "imageGeneration" + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2-Codex", - "display_name": "GPT-5.2-Codex", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini-3.1-Flash-Lite", + "display_name": "Gemini-3.1-Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -12551,47 +13251,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "release_date": "2026-02-18", + "last_updated": "2026-02-18", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-raw", - "name": "GPT-3.5-Turbo-Raw", - "display_name": "GPT-3.5-Turbo-Raw", + "id": "google/imagen-4", + "name": "Imagen-4", + "display_name": "Imagen-4", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 4524, - "output": 2048 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -12600,121 +13283,105 @@ }, "attachment": true, "open_weights": false, - "release_date": "2023-09-27", - "last_updated": "2023-09-27", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4-Nano", - "display_name": "GPT-5.4-Nano", + "id": "google/gemini-2.5-pro", + "name": "Gemini-2.5-Pro", + "display_name": "Gemini-2.5-Pro", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1065535, + "output": 65535 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2025-02-05", + "last_updated": "2025-02-05", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5-Pro", - "display_name": "GPT-5-Pro", + "id": "google/veo-3.1", + "name": "Veo-3.1", + "display_name": "Veo-3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4-Mini", - "display_name": "GPT-5.4-Mini", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini-2.5-Flash-Lite", + "display_name": "Gemini-2.5-Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1024000, + "output": 64000 }, "temperature": false, "tool_call": true, @@ -12726,140 +13393,99 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-12", - "last_updated": "2026-03-12", + "release_date": "2025-06-19", + "last_updated": "2025-06-19", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "google/gemini-2.0-flash-lite", + "name": "Gemini-2.0-Flash-Lite", + "display_name": "Gemini-2.0-Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 990000, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2024-12-18", - "last_updated": "2024-12-18", + "release_date": "2025-02-05", + "last_updated": "2025-02-05", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "google/lyria", + "name": "Lyria", + "display_name": "Lyria", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2025-06-04", + "last_updated": "2025-06-04", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3-Codex", - "display_name": "GPT-5.3-Codex", + "id": "poetools/claude-code", + "name": "claude-code", + "display_name": "claude-code", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -12867,141 +13493,82 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-02-10", - "last_updated": "2026-02-10", + "release_date": "2025-11-27", + "last_updated": "2025-11-27", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5-mini", - "display_name": "GPT-5-mini", + "id": "ideogramai/ideogram-v2", + "name": "Ideogram-v2", + "display_name": "Ideogram-v2", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 150, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-06-25", - "last_updated": "2025-06-25", + "release_date": "2024-08-21", + "last_updated": "2024-08-21", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "o1-pro", - "display_name": "o1-pro", + "id": "ideogramai/ideogram-v2a", + "name": "Ideogram-v2a", + "display_name": "Ideogram-v2a", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 150, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "release_date": "2025-02-27", + "last_updated": "2025-02-27", "type": "chat" }, { - "id": "openai/sora-2", - "name": "Sora-2", - "display_name": "Sora-2", + "id": "ideogramai/ideogram", + "name": "Ideogram", + "display_name": "Ideogram", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "image" ] }, "limit": { - "context": 8192, + "context": 150, "output": 8192 }, "temperature": false, @@ -13011,142 +13578,95 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "release_date": "2024-04-03", + "last_updated": "2024-04-03", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "ideogramai/ideogram-v2a-turbo", + "name": "Ideogram-v2a-Turbo", + "display_name": "Ideogram-v2a-Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 150, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "release_date": "2025-02-27", + "last_updated": "2025-02-27", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4-Turbo", - "display_name": "GPT-4-Turbo", + "id": "empiriolabs/deepseek-v4-flash-el", + "name": "DeepSeek-V4-Flash-EL", + "display_name": "DeepSeek-V4-Flash-EL", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 384000 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2023-09-13", - "last_updated": "2023-09-13", + "open_weights": true, + "release_date": "2026-04-24", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1-Codex", - "display_name": "GPT-5.1-Codex", + "id": "empiriolabs/deepseek-v4-pro-el", + "name": "DeepSeek-V4-Pro-EL", + "display_name": "DeepSeek-V4-Pro-EL", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "open_weights": true, + "release_date": "2026-04-24", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5-nano", - "display_name": "GPT-5-nano", + "id": "xai/grok-4", + "name": "Grok-4", + "display_name": "Grok-4", "modalities": { "input": [ "text", @@ -13157,7 +13677,7 @@ ] }, "limit": { - "context": 400000, + "context": 256000, "output": 128000 }, "temperature": false, @@ -13168,35 +13688,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-07-10", + "last_updated": "2025-07-10", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "xai/grok-4.1-fast-reasoning", + "name": "Grok-4.1-Fast-Reasoning", + "display_name": "Grok-4.1-Fast-Reasoning", "modalities": { "input": [ "text", @@ -13207,8 +13711,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 2000000, + "output": 30000 }, "temperature": false, "tool_call": true, @@ -13216,30 +13720,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "GPT-3.5-Turbo-Instruct", - "display_name": "GPT-3.5-Turbo-Instruct", + "id": "xai/grok-4.20-multi-agent", + "name": "Grok-4.20-Multi-Agent", + "display_name": "Grok-4.20-Multi-Agent", "modalities": { "input": [ "text", @@ -13250,8 +13740,8 @@ ] }, "limit": { - "context": 3500, - "output": 1024 + "context": 128000, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -13260,42 +13750,48 @@ }, "attachment": true, "open_weights": false, - "release_date": "2023-09-20", - "last_updated": "2023-09-20", + "release_date": "2026-03-13", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-image-1", - "name": "GPT-Image-1", - "display_name": "GPT-Image-1", + "id": "xai/grok-4-fast-reasoning", + "name": "Grok-4-Fast-Reasoning", + "display_name": "Grok-4-Fast-Reasoning", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 2000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-31", - "last_updated": "2025-03-31", - "type": "imageGeneration" + "release_date": "2025-09-16", + "last_updated": "2025-09-16", + "type": "chat" }, { - "id": "openai/gpt-4o-mini-search", - "name": "GPT-4o-mini-Search", - "display_name": "GPT-4o-mini-Search", + "id": "xai/grok-code-fast-1", + "name": "Grok Code Fast 1", + "display_name": "Grok Code Fast 1", "modalities": { "input": [ "text" @@ -13305,24 +13801,30 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 256000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-11", - "last_updated": "2025-03-11", + "release_date": "2025-08-22", + "last_updated": "2025-08-22", "type": "chat" }, { - "id": "openai/gpt-5.2-instant", - "name": "GPT-5.2-Instant", - "display_name": "GPT-5.2-Instant", + "id": "xai/grok-4-fast-non-reasoning", + "name": "Grok-4-Fast-Non-Reasoning", + "display_name": "Grok-4-Fast-Non-Reasoning", "modalities": { "input": [ "text", @@ -13333,47 +13835,24 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 2000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2025-09-16", + "last_updated": "2025-09-16", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "xai/grok-4.1-fast-non-reasoning", + "name": "Grok-4.1-Fast-Non-Reasoning", + "display_name": "Grok-4.1-Fast-Non-Reasoning", "modalities": { "input": [ "text", @@ -13384,8 +13863,8 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 2000000, + "output": 30000 }, "temperature": false, "tool_call": true, @@ -13394,26 +13873,25 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "xai/grok-3-mini", + "name": "Grok 3 Mini", + "display_name": "Grok 3 Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -13421,109 +13899,71 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2025-04-11", + "last_updated": "2025-04-11", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1-Codex-Max", - "display_name": "GPT-5.1-Codex-Max", + "id": "xai/grok-3", + "name": "Grok 3", + "display_name": "Grok 3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2025-04-11", + "last_updated": "2025-04-11", "type": "chat" }, { - "id": "novita/glm-4.6v", - "name": "glm-4.6v", - "display_name": "glm-4.6v", + "id": "lumalabs/ray2", + "name": "Ray2", + "display_name": "Ray2", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 5000, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "release_date": "2025-02-20", + "last_updated": "2025-02-20", "type": "chat" }, { - "id": "novita/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "trytako/tako", + "name": "Tako", + "display_name": "Tako", "modalities": { "input": [ "text" @@ -13533,414 +13973,555 @@ ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 2048, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2024-08-15", + "last_updated": "2024-08-15", "type": "chat" }, { - "id": "novita/kimi-k2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "runwayml/runway-gen-4-turbo", + "name": "Runway-Gen-4-Turbo", + "display_name": "Runway-Gen-4-Turbo", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 256, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2025-05-09", + "last_updated": "2025-05-09", "type": "chat" }, { - "id": "novita/glm-4.7-flash", - "name": "glm-4.7-flash", - "display_name": "glm-4.7-flash", + "id": "runwayml/runway", + "name": "Runway", + "display_name": "Runway", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 200000, - "output": 65500 + "context": 256, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2024-10-11", + "last_updated": "2024-10-11", "type": "chat" }, { - "id": "novita/kimi-k2.6", - "name": "Kimi-K2.6", - "display_name": "Kimi-K2.6", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude-Sonnet-4.6", + "display_name": "Claude-Sonnet-4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 983040, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-05-02", + "open_weights": false, + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "novita/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "anthropic/claude-opus-4.1", + "name": "Claude-Opus-4.1", + "display_name": "Claude-Opus-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 196608, + "output": 32000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "novita/deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "anthropic/claude-opus-4.5", + "name": "Claude-Opus-4.5", + "display_name": "Claude-Opus-4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 196608, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "release_date": "2025-11-21", + "last_updated": "2025-11-21", "type": "chat" }, { - "id": "novita/glm-4.7", - "name": "glm-4.7", - "display_name": "glm-4.7", + "id": "anthropic/claude-opus-4.7", + "name": "Claude-Opus-4.7", + "display_name": "Claude-Opus-4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 1048576, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-04-15", + "last_updated": "2026-04-15", "type": "chat" }, { - "id": "novita/kimi-k2-thinking", - "name": "kimi-k2-thinking", - "display_name": "kimi-k2-thinking", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude-Sonnet-4.5", + "display_name": "Claude-Sonnet-4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 983040, + "output": 32768 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-07", - "last_updated": "2025-11-07", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "novita/minimax-m2.1", - "name": "minimax-m2.1", - "display_name": "minimax-m2.1", + "id": "anthropic/claude-sonnet-3.5", + "name": "Claude-Sonnet-3.5", + "display_name": "Claude-Sonnet-3.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 189096, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-26", - "last_updated": "2025-12-26", + "release_date": "2024-06-05", + "last_updated": "2024-06-05", "type": "chat" }, { - "id": "novita/glm-4.7-n", - "name": "glm-4.7-n", - "display_name": "glm-4.7-n", + "id": "anthropic/claude-haiku-3.5", + "name": "Claude-Haiku-3.5", + "display_name": "Claude-Haiku-3.5", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 189096, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-10-01", + "last_updated": "2024-10-01", + "type": "chat" + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Claude-Sonnet-4", + "display_name": "Claude-Sonnet-4", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 983040, + "output": 64000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2025-05-21", + "last_updated": "2025-05-21", "type": "chat" }, { - "id": "elevenlabs/elevenlabs-v2.5-turbo", - "name": "ElevenLabs-v2.5-Turbo", - "display_name": "ElevenLabs-v2.5-Turbo", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude-Haiku-4.5", + "display_name": "Claude-Haiku-4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 192000, + "output": 64000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-10-28", - "last_updated": "2024-10-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "elevenlabs/elevenlabs-v3", - "name": "ElevenLabs-v3", - "display_name": "ElevenLabs-v3", + "id": "anthropic/claude-sonnet-3.7", + "name": "Claude-Sonnet-3.7", + "display_name": "Claude-Sonnet-3.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 196608, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "elevenlabs/elevenlabs-music", - "name": "ElevenLabs-Music", - "display_name": "ElevenLabs-Music", + "id": "anthropic/claude-sonnet-3.5-june", + "name": "Claude-Sonnet-3.5-June", + "display_name": "Claude-Sonnet-3.5-June", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 2000, + "context": 189096, "output": 8192 }, "temperature": false, @@ -13950,182 +14531,209 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-29", - "last_updated": "2025-08-29", + "release_date": "2024-11-18", + "last_updated": "2024-11-18", "type": "chat" - } - ] - }, - "baseten": { - "id": "baseten", - "name": "Baseten", - "display_name": "Baseten", - "api": "https://inference.baseten.co/v1", - "doc": "https://docs.baseten.co/inference/model-apis/overview", - "models": [ + }, { - "id": "nvidia/Nemotron-120B-A12B", - "name": "Nemotron Super", - "display_name": "Nemotron Super", + "id": "anthropic/claude-opus-4", + "name": "Claude-Opus-4", + "display_name": "Claude-Opus-4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 202800 + "context": 192512, + "output": 28672 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-02", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-21", + "last_updated": "2025-05-21", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", - "name": "Nemotron Ultra", - "display_name": "Nemotron Ultra", + "id": "anthropic/claude-opus-4.8", + "name": "Claude-Opus-4.8", + "display_name": "Claude-Opus-4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 202800 + "context": 1048576, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "anthropic/claude-haiku-3", + "name": "Claude-Haiku-3", + "display_name": "Claude-Haiku-3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 189096, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "release_date": "2024-03-09", + "last_updated": "2024-03-09", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "anthropic/claude-opus-4.6", + "name": "Claude-Opus-4.6", + "display_name": "Claude-Opus-4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 983040, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM 5", - "display_name": "GLM 5", + "id": "cerebras/qwen3-235b-2507-cs", + "name": "qwen3-235b-2507-cs", + "display_name": "qwen3-235b-2507-cs", "modalities": { "input": [ "text" @@ -14135,37 +14743,25 @@ ] }, "limit": { - "context": 202800, - "output": 202800 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-06", + "last_updated": "2025-08-06", "type": "chat" }, { - "id": "zai-org/GLM-5.2-Fast", - "name": "GLM 5.2 Fast", - "display_name": "GLM 5.2 Fast", + "id": "cerebras/llama-3.1-8b-cs", + "name": "Llama-3.1-8B-CS", + "display_name": "Llama-3.1-8B-CS", "modalities": { "input": [ "text" @@ -14175,36 +14771,24 @@ ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-13", + "last_updated": "2025-05-13", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "cerebras/qwen3-32b-cs", + "name": "qwen3-32b-cs", + "display_name": "qwen3-32b-cs", "modalities": { "input": [ "text" @@ -14214,36 +14798,25 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-15", + "last_updated": "2025-05-15", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "cerebras/gpt-oss-120b-cs", + "name": "GPT-OSS-120B-CS", + "display_name": "GPT-OSS-120B-CS", "modalities": { "input": [ "text" @@ -14253,36 +14826,25 @@ ] }, "limit": { - "context": 202800, - "output": 202800 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-06", + "last_updated": "2025-08-06", "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "cerebras/llama-3.3-70b-cs", + "name": "llama-3.3-70b-cs", + "display_name": "llama-3.3-70b-cs", "modalities": { "input": [ "text" @@ -14292,37 +14854,24 @@ ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-13", + "last_updated": "2025-05-13", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1-Codex-Mini", + "display_name": "GPT-5.1-Codex-Mini", "modalities": { "input": [ "text" @@ -14332,118 +14881,138 @@ ] }, "limit": { - "context": 204000, - "output": 204000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "imageGeneration" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2-Pro", + "display_name": "GPT-5.2-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 131000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-25", - "last_updated": "2025-08-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "Deepseek V4 Pro", - "display_name": "Deepseek V4 Pro", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5-Pro", + "display_name": "GPT-5.5-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -14451,26 +15020,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1-mini", + "display_name": "GPT-4.1-mini", "modalities": { "input": [ "text", @@ -14481,37 +15044,24 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1047576, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", @@ -14522,72 +15072,52 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-01-30", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/sora-2-pro", + "name": "Sora-2-Pro", + "display_name": "Sora-2-Pro", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai/gpt-5-chat", + "name": "GPT-5-Chat", + "display_name": "GPT-5-Chat", "modalities": { "input": [ "text", @@ -14598,30 +15128,24 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "OpenAI GPT 120B", - "display_name": "OpenAI GPT 120B", + "id": "openai/gpt-5.3-codex-spark", + "name": "GPT-5.3-Codex-Spark", + "display_name": "GPT-5.3-Codex-Spark", "modalities": { "input": [ "text" @@ -14631,10 +15155,10 @@ ] }, "limit": { - "context": 128072, - "output": 128072 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -14642,138 +15166,183 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-04", + "last_updated": "2026-03-04", "type": "chat" - } - ] - }, - "nvidia": { - "id": "nvidia", - "name": "Nvidia", - "display_name": "Nvidia", - "api": "https://integrate.api.nvidia.com/v1", - "doc": "https://docs.api.nvidia.com/nim/", - "models": [ + }, { - "id": "microsoft/phi-4-mini-instruct", - "name": "Phi-4-Mini", - "display_name": "Phi-4-Mini", + "id": "openai/gpt-4o-aug", + "name": "GPT-4o-Aug", + "display_name": "GPT-4o-Aug", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2024-12-01", - "last_updated": "2025-09-05", + "attachment": true, + "open_weights": false, + "release_date": "2024-11-21", + "last_updated": "2024-11-21", "type": "chat" }, { - "id": "microsoft/phi-4-multimodal-instruct", - "name": "Phi 4 Multimodal", - "display_name": "Phi 4 Multimodal", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4-Pro", + "display_name": "GPT-5.4-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "nvidia/magpie-tts-zeroshot", - "name": "magpie-tts-zeroshot", - "display_name": "magpie-tts-zeroshot", + "id": "openai/o3-mini-high", + "name": "o3-mini-high", + "display_name": "o3-mini-high", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 200000, + "output": 100000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-05-22", - "last_updated": "2025-06-12", + "open_weights": false, + "release_date": "2025-01-31", + "last_updated": "2025-01-31", "type": "chat" }, { - "id": "nvidia/nv-embedcode-7b-v1", - "name": "nv-embedcode-7b-v1", - "display_name": "nv-embedcode-7b-v1", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1-nano", + "display_name": "GPT-4.1-nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 1047576, + "output": 32768 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-17", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "nvidia/studiovoice", - "name": "studiovoice", - "display_name": "studiovoice", + "id": "openai/gpt-4o-search", + "name": "GPT-4o-Search", + "display_name": "GPT-4o-Search", "modalities": { "input": [ "text" @@ -14786,24 +15355,25 @@ "context": 128000, "output": 8192 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-10-03", - "last_updated": "2025-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-03-11", + "last_updated": "2025-03-11", "type": "chat" }, { - "id": "nvidia/sparsedrive", - "name": "sparsedrive", - "display_name": "sparsedrive", + "id": "openai/chatgpt-4o-latest", + "name": "ChatGPT-4o-Latest", + "display_name": "ChatGPT-4o-Latest", "modalities": { "input": [ - "video" + "text", + "image" ], "output": [ "text" @@ -14813,66 +15383,85 @@ "context": 128000, "output": 8192 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-07-20", + "open_weights": false, + "release_date": "2024-08-14", + "last_updated": "2024-08-14", "type": "chat" }, { - "id": "nvidia/cosmos-reason2-8b", - "name": "Cosmos Reason2 8B", - "display_name": "Cosmos Reason2 8B", + "id": "openai/gpt-5.1-instant", + "name": "GPT-5.1-Instant", + "display_name": "GPT-5.1-Instant", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", "type": "chat" }, { - "id": "nvidia/nemotron-nano-12b-v2-vl", - "name": "Nemotron Nano 12B v2 VL", - "display_name": "Nemotron Nano 12B v2 VL", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -14880,246 +15469,312 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "open_weights": false, + "release_date": "2025-01-31", + "last_updated": "2025-01-31", "type": "chat" }, { - "id": "nvidia/bevformer", - "name": "bevformer", - "display_name": "bevformer", + "id": "openai/gpt-4-classic", + "name": "GPT-4-Classic", + "display_name": "GPT-4-Classic", "modalities": { "input": [ - "video" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 8192, + "output": 4096 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-07-20", + "open_weights": false, + "release_date": "2024-03-25", + "last_updated": "2024-03-25", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "nemotron-3-nano-30b-a3b", - "display_name": "nemotron-3-nano-30b-a3b", + "id": "openai/gpt-image-1-mini", + "name": "GPT-Image-1-Mini", + "display_name": "GPT-Image-1-Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-12", - "last_updated": "2024-12", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "imageGeneration" }, { - "id": "nvidia/llama-3.3-nemotron-super-49b-v1.5", - "name": "Llama 3.3 Nemotron Super 49B v1.5", - "display_name": "Llama 3.3 Nemotron Super 49B v1.5", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "nvidia/cosmos-transfer2_5-2b", - "name": "cosmos-transfer2.5-2b", - "display_name": "cosmos-transfer2.5-2b", + "id": "openai/gpt-5.3-instant", + "name": "GPT-5.3-Instant", + "display_name": "GPT-5.3-Instant", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-02-26", + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-nano-8b-v1", - "name": "Llama 3.1 Nemotron Nano 8B v1", - "display_name": "Llama 3.1 Nemotron Nano 8B v1", + "id": "openai/o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-03-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "nvidia/active-speaker-detection", - "name": "Active Speaker Detection", - "display_name": "Active Speaker Detection", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o-mini", + "display_name": "GPT-4o-mini", "modalities": { "input": [ - "video" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, + "context": 124096, "output": 4096 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": false, + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "nvidia/usdvalidate", - "name": "usdvalidate", - "display_name": "usdvalidate", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-24", - "last_updated": "2025-01-08", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", - "name": "llama-3.1-nemotron-safety-guard-8b-v3", - "display_name": "llama-3.1-nemotron-safety-guard-8b-v3", + "id": "openai/dall-e-3", + "name": "DALL-E-3", + "display_name": "DALL-E-3", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 800, + "output": 8192 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2023-11-06", + "last_updated": "2023-11-06", + "type": "imageGeneration" }, { - "id": "nvidia/llama-3.3-nemotron-super-49b-v1", - "name": "Llama 3.3 Nemotron Super 49B v1", - "display_name": "Llama 3.3 Nemotron Super 49B v1", + "id": "openai/o4-mini-deep-research", + "name": "o4-mini-deep-research", + "display_name": "o4-mini-deep-research", "modalities": { "input": [ "text" @@ -15129,52 +15784,39 @@ ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-07", - "last_updated": "2025-04-07", - "type": "chat" - }, - { - "id": "nvidia/llama-3.1-nemotron-70b-instruct", - "name": "Llama 3.1 Nemotron 70B Instruct", - "display_name": "Llama 3.1 Nemotron 70B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super", - "display_name": "Nemotron 3 Super", + "id": "openai/o3-deep-research", + "name": "o3-deep-research", + "display_name": "o3-deep-research", "modalities": { "input": [ "text" @@ -15184,10 +15826,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -15195,147 +15837,228 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "nvidia/nemotron-3-content-safety", - "name": "nemotron-3-content-safety", - "display_name": "nemotron-3-content-safety", + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "nvidia/cosmos-transfer1-7b", - "name": "cosmos-transfer1-7b", - "display_name": "cosmos-transfer1-7b", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-Turbo", + "display_name": "GPT-3.5-Turbo", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 16384, + "output": 2048 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-06-13", - "last_updated": "2025-06-30", + "open_weights": false, + "release_date": "2023-09-13", + "last_updated": "2023-09-13", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-ultra-253b-v1", - "name": "Llama 3.1 Nemotron Ultra 253B", - "display_name": "Llama 3.1 Nemotron Ultra 253B", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-07", - "last_updated": "2025-04-07", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", "type": "chat" }, { - "id": "nvidia/llama-3_2-nemoretriever-300m-embed-v1", - "name": "llama-3_2-nemoretriever-300m-embed-v1", - "display_name": "llama-3_2-nemoretriever-300m-embed-v1", + "id": "openai/gpt-4-classic-0314", + "name": "GPT-4-Classic-0314", + "display_name": "GPT-4-Classic-0314", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 8192, + "output": 4096 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-24", - "last_updated": "2025-07-24", + "attachment": true, + "open_weights": false, + "release_date": "2024-08-26", + "last_updated": "2024-08-26", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", - "name": "Nemotron 3 Nano Omni", - "display_name": "Nemotron 3 Nano Omni", + "id": "openai/gpt-image-1.5", + "name": "gpt-image-1.5", + "display_name": "gpt-image-1.5", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "type": "imageGeneration" + }, + { + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "display_name": "GPT-5.2-Codex", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -15343,73 +16066,114 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "open_weights": false, + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" }, { - "id": "nvidia/gliner-pii", - "name": "gliner-pii", - "display_name": "gliner-pii", + "id": "openai/gpt-3.5-turbo-raw", + "name": "GPT-3.5-Turbo-Raw", + "display_name": "GPT-3.5-Turbo-Raw", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 4524, + "output": 2048 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "attachment": true, + "open_weights": false, + "release_date": "2023-09-27", + "last_updated": "2023-09-27", "type": "chat" }, { - "id": "nvidia/rerank-qa-mistral-4b", - "name": "rerank-qa-mistral-4b", - "display_name": "rerank-qa-mistral-4b", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4-Nano", + "display_name": "GPT-5.4-Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-03-17", - "last_updated": "2025-01-17", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-nano-vl-8b-v1", - "name": "Llama 3.1 Nemotron Nano VL 8B v1", - "display_name": "Llama 3.1 Nemotron Nano VL 8B v1", + "id": "openai/gpt-5-pro", + "name": "GPT-5-Pro", + "display_name": "GPT-5-Pro", "modalities": { "input": [ "text", @@ -15420,107 +16184,185 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-10", - "last_updated": "2025-04-10", + "open_weights": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "nvidia/synthetic-video-detector", - "name": "synthetic-video-detector", - "display_name": "synthetic-video-detector", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4-Mini", + "display_name": "GPT-5.4-Mini", "modalities": { "input": [ - "video" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": false, + "release_date": "2026-03-12", + "last_updated": "2026-03-12", "type": "chat" }, { - "id": "nvidia/streampetr", - "name": "streampetr", - "display_name": "streampetr", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ - "video" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": false, + "release_date": "2024-12-18", + "last_updated": "2024-12-18", "type": "chat" }, { - "id": "nvidia/nemotron-voicechat", - "name": "nemotron-voicechat", - "display_name": "nemotron-voicechat", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "nvidia/llama-nemotron-embed-vl-1b-v2", - "name": "llama-nemotron-embed-vl-1b-v2", - "display_name": "llama-nemotron-embed-vl-1b-v2", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3-Codex", + "display_name": "GPT-5.3-Codex", "modalities": { "input": [ "text", @@ -15531,141 +16373,217 @@ ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, + "open_weights": false, "release_date": "2026-02-10", "last_updated": "2026-02-10", "type": "chat" }, { - "id": "nvidia/nvidia-nemotron-nano-9b-v2", - "name": "nvidia-nemotron-nano-9b-v2", - "display_name": "nvidia-nemotron-nano-9b-v2", + "id": "openai/gpt-5-mini", + "name": "GPT-5-mini", + "display_name": "GPT-5-mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-06-25", + "last_updated": "2025-06-25", "type": "chat" }, { - "id": "nvidia/riva-translate-4b-instruct-v1.1", - "name": "riva-translate-4b-instruct-v1_1", - "display_name": "riva-translate-4b-instruct-v1_1", + "id": "openai/o1-pro", + "name": "o1-pro", + "display_name": "o1-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 100000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-12", - "last_updated": "2025-12-12", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-03-19", + "last_updated": "2025-03-19", "type": "chat" }, { - "id": "nvidia/nemotron-content-safety-reasoning-4b", - "name": "nemotron-content-safety-reasoning-4b", - "display_name": "nemotron-content-safety-reasoning-4b", + "id": "openai/sora-2", + "name": "Sora-2", + "display_name": "Sora-2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", "type": "chat" }, { - "id": "nvidia/llama-nemotron-rerank-vl-1b-v2", - "name": "llama-nemotron-rerank-vl-1b-v2", - "display_name": "llama-nemotron-rerank-vl-1b-v2", + "id": "openai/gpt-4-turbo", + "name": "GPT-4-Turbo", + "display_name": "GPT-4-Turbo", "modalities": { "input": [ "text", @@ -15680,189 +16598,250 @@ "output": 4096 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "open_weights": false, + "release_date": "2023-09-13", + "last_updated": "2023-09-13", "type": "chat" }, { - "id": "nvidia/nv-embed-v1", - "name": "nv-embed-v1", - "display_name": "nv-embed-v1", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "display_name": "GPT-5.1-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-06-07", - "last_updated": "2025-07-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", "type": "chat" }, { - "id": "nvidia/cosmos-predict1-5b", - "name": "cosmos-predict1-5b", - "display_name": "cosmos-predict1-5b", + "id": "openai/gpt-5-nano", + "name": "GPT-5-nano", + "display_name": "GPT-5-nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-03-18", + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "nvidia/nemotron-mini-4b-instruct", - "name": "nemotron-mini-4b-instruct", - "display_name": "nemotron-mini-4b-instruct", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-08-21", - "last_updated": "2024-08-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "nvidia/usdcode", - "name": "usdcode", - "display_name": "usdcode", + "id": "openai/gpt-3.5-turbo-instruct", + "name": "GPT-3.5-Turbo-Instruct", + "display_name": "GPT-3.5-Turbo-Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 3500, + "output": 1024 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-01", - "last_updated": "2026-01-01", + "release_date": "2023-09-20", + "last_updated": "2023-09-20", "type": "chat" }, { - "id": "google/google-paligemma", - "name": "paligemma", - "display_name": "paligemma", + "id": "openai/gpt-image-1", + "name": "GPT-Image-1", + "display_name": "GPT-Image-1", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { "context": 128000, "output": 8192 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2024-05-14", - "last_updated": "2024-08-26", - "type": "chat" + "open_weights": false, + "release_date": "2025-03-31", + "last_updated": "2025-03-31", + "type": "imageGeneration" }, { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "openai/gpt-4o-mini-search", + "name": "GPT-4o-mini-Search", + "display_name": "GPT-4o-mini-Search", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "release_date": "2025-03-11", + "last_updated": "2025-03-11", "type": "chat" }, { - "id": "google/gemma-2-2b-it", - "name": "Gemma 2 2b It", - "display_name": "Gemma 2 2b It", + "id": "openai/gpt-5.2-instant", + "name": "GPT-5.2-Instant", + "display_name": "GPT-5.2-Instant", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -15870,23 +16849,46 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-16", - "last_updated": "2024-07-16", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -15897,39 +16899,38 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1047576, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma-4-31B-IT", - "display_name": "Gemma-4-31B-IT", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -15937,20 +16938,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "google/gemma-3n-e4b-it", - "name": "Gemma 3n E4b It", - "display_name": "Gemma 3n E4b It", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1-Codex-Max", + "display_name": "GPT-5.1-Codex-Max", "modalities": { "input": [ "text", @@ -15961,25 +16970,46 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-06-03", - "last_updated": "2025-06-03", + "open_weights": false, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "google/gemma-3n-e2b-it", - "name": "Gemma 3n E2b It", - "display_name": "Gemma 3n E2b It", + "id": "novita/glm-4.6v", + "name": "glm-4.6v", + "display_name": "glm-4.6v", "modalities": { "input": [ "text", @@ -15990,38 +17020,36 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131000, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-06-12", - "last_updated": "2025-06-12", + "open_weights": false, + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "novita/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 205000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -16029,43 +17057,68 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", - "type": "chat" - }, - { - "id": "baai/bge-m3", - "name": "BGE M3", - "display_name": "BGE M3", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", + "type": "chat" + }, + { + "id": "novita/kimi-k2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 1024 + "context": 128000, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-30", - "last_updated": "2026-04-30", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "type": "chat" }, { - "id": "qwen/qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "novita/glm-4.7-flash", + "name": "glm-4.7-flash", + "display_name": "glm-4.7-flash", "modalities": { "input": [ "text" @@ -16075,53 +17128,66 @@ ] }, "limit": { - "context": 262144, - "output": 66536 + "context": 200000, + "output": 65500 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "qwen/qwen-image-edit", - "name": "Qwen Image Edit", - "display_name": "Qwen Image Edit", + "id": "novita/kimi-k2.6", + "name": "Kimi-K2.6", + "display_name": "Kimi-K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-08-19", - "last_updated": "2025-08-19", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-05-02", + "type": "chat" }, { - "id": "qwen/qwen2.5-coder-32b-instruct", - "name": "Qwen2.5 Coder 32b Instruct", - "display_name": "Qwen2.5 Coder 32b Instruct", + "id": "novita/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -16131,64 +17197,73 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-11-06", - "last_updated": "2024-11-06", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "qwen/qwen-image", - "name": "Qwen Image", - "display_name": "Qwen Image", + "id": "novita/deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, + "context": 128000, "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "imageGeneration" + "open_weights": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5-397B-A17B", - "display_name": "Qwen3.5-397B-A17B", + "id": "novita/glm-4.7", + "name": "glm-4.7", + "display_name": "glm-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 205000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -16208,32 +17283,28 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": false, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "novita/kimi-k2-thinking", + "name": "kimi-k2-thinking", + "display_name": "kimi-k2-thinking", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -16251,15 +17322,15 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2025-11-07", + "last_updated": "2025-11-07", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next-80B-A3B-Instruct", - "display_name": "Qwen3-Next-80B-A3B-Instruct", + "id": "novita/minimax-m2.1", + "name": "minimax-m2.1", + "display_name": "minimax-m2.1", "modalities": { "input": [ "text" @@ -16269,25 +17340,30 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 205000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-01", - "last_updated": "2025-09-05", + "release_date": "2025-12-26", + "last_updated": "2025-12-26", "type": "chat" }, { - "id": "abacusai/dracarys-llama-3.1-70b-instruct", - "name": "dracarys-llama-3.1-70b-instruct", - "display_name": "dracarys-llama-3.1-70b-instruct", + "id": "novita/glm-4.7-n", + "name": "glm-4.7-n", + "display_name": "glm-4.7-n", "modalities": { "input": [ "text" @@ -16297,164 +17373,194 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 205000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-11", - "last_updated": "2025-05-22", + "attachment": true, + "open_weights": false, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "upstage/solar-10.7b-instruct", - "name": "solar-10.7b-instruct", - "display_name": "solar-10.7b-instruct", + "id": "elevenlabs/elevenlabs-v2.5-turbo", + "name": "ElevenLabs-v2.5-Turbo", + "display_name": "ElevenLabs-v2.5-Turbo", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { "context": 128000, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-06-05", - "last_updated": "2025-04-10", + "attachment": true, + "open_weights": false, + "release_date": "2024-10-28", + "last_updated": "2024-10-28", "type": "chat" }, { - "id": "black-forest-labs/flux_2-klein-4b", - "name": "FLUX.2 Klein 4B", - "display_name": "FLUX.2 Klein 4B", + "id": "elevenlabs/elevenlabs-v3", + "name": "ElevenLabs-v3", + "display_name": "ElevenLabs-v3", "modalities": { "input": [ - "image", "text" ], "output": [ - "image" + "audio" ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 128000, + "output": 8192 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-01-14", - "last_updated": "2026-01-31", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "black-forest-labs/flux_1-schnell", - "name": "FLUX.1-schnell", - "display_name": "FLUX.1-schnell", + "id": "elevenlabs/elevenlabs-music", + "name": "ElevenLabs-Music", + "display_name": "ElevenLabs-Music", "modalities": { "input": [ "text" ], "output": [ - "image" + "audio" ] }, "limit": { - "context": 77, + "context": 2000, "output": 8192 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-08-01", - "last_updated": "2026-02-04", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-29", + "last_updated": "2025-08-29", "type": "chat" - }, + } + ] + }, + "baseten": { + "id": "baseten", + "name": "Baseten", + "display_name": "Baseten", + "api": "https://inference.baseten.co/v1", + "doc": "https://docs.baseten.co/inference/model-apis/overview", + "models": [ { - "id": "black-forest-labs/flux_1-kontext-dev", - "name": "FLUX.1-Kontext-dev", - "display_name": "FLUX.1-Kontext-dev", + "id": "nvidia/Nemotron-120B-A12B", + "name": "Nemotron Super", + "display_name": "Nemotron Super", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 202800, + "output": 202800 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-08-12", - "last_updated": "2025-08-12", + "knowledge": "2026-02", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "black-forest-labs/flux.1-dev", - "name": "FLUX.1-dev", - "display_name": "FLUX.1-dev", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "name": "Nemotron Ultra", + "display_name": "Nemotron Ultra", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 4096, - "output": 8192 + "context": 202800, + "output": 202800 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-08", - "release_date": "2024-08-01", - "last_updated": "2025-09-05", + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.5-128b", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", @@ -16465,7 +17571,7 @@ ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 32768 }, "temperature": true, @@ -16474,82 +17580,118 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "mistralai/mistral-nemotron", - "name": "mistral-nemotron", - "display_name": "mistral-nemotron", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-06-11", - "last_updated": "2025-06-12", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "mistralai/mistral-medium-3-instruct", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "zai-org/GLM-5", + "name": "GLM 5", + "display_name": "GLM 5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 202800, + "output": 202800 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2026-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mistralai/mistral-small-4-119b-2603", - "name": "mistral-small-4-119b-2603", - "display_name": "mistral-small-4-119b-2603", + "id": "zai-org/GLM-5.2-Fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 524288, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -16557,73 +17699,105 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistralai/mistral-large-3-675b-instruct-2512", - "name": "Mistral Large 3 675B Instruct 2512", - "display_name": "Mistral Large 3 675B Instruct 2512", + "id": "zai-org/GLM-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistralai/ministral-14b-instruct-2512", - "name": "Ministral 3 14B Instruct 2512", - "display_name": "Ministral 3 14B Instruct 2512", + "id": "zai-org/GLM-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 202800, + "output": 202800 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "mistralai/mixtral-8x22b-instruct", - "name": "Mistral: Mixtral 8x22B Instruct", - "display_name": "Mistral: Mixtral 8x22B Instruct", + "id": "zai-org/GLM-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ "text" @@ -16633,24 +17807,37 @@ ] }, "limit": { - "context": 65536, - "output": 13108 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "mistralai/magistral-small-2506", - "name": "Magistral Small 2506", - "display_name": "Magistral Small 2506", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -16660,23 +17847,37 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 204000, + "output": 204000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "knowledge": "2026-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mistralai/mixtral-8x7b-instruct", - "name": "Mistral: Mixtral 8x7B Instruct", - "display_name": "Mistral: Mixtral 8x7B Instruct", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "Deepseek V4 Flash 0731", + "display_name": "Deepseek V4 Flash 0731", "modalities": { "input": [ "text" @@ -16686,24 +17887,37 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2023-12-10", - "last_updated": "2026-03-15", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "mistralai/mistral-7b-instruct-v0.3", - "name": "Mistral-7B-Instruct-v0.3", - "display_name": "Mistral-7B-Instruct-v0.3", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ "text" @@ -16713,24 +17927,25 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 164000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-04-01", - "last_updated": "2025-04-01", + "release_date": "2025-08-25", + "last_updated": "2025-08-25", "type": "chat" }, { - "id": "bytedance/seed-oss-36b-instruct", - "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "Deepseek V4 Pro", + "display_name": "Deepseek V4 Pro", "modalities": { "input": [ "text" @@ -16740,56 +17955,78 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-04", - "last_updated": "2025-11-25", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "meta/llama-3.1-70b-instruct", - "name": "Llama 3.1 70b Instruct", - "display_name": "Llama 3.1 70b Instruct", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-07-16", - "last_updated": "2024-07-16", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "meta/llama-4-maverick-17b-128e-instruct", - "name": "Llama 4 Maverick 17b 128e Instruct", - "display_name": "Llama 4 Maverick 17b 128e Instruct", + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -16800,25 +18037,37 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-02", - "release_date": "2025-04-01", - "last_updated": "2025-04-01", + "knowledge": "2025-12", + "release_date": "2026-01-30", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "meta/llama-guard-4-12b", - "name": "Llama Guard 4 12B", - "display_name": "Llama Guard 4 12B", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -16829,52 +18078,65 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262000, + "output": 262000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-04-05", - "last_updated": "2026-04-30", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "meta/llama-3.2-1b-instruct", - "name": "Llama 3.2 1b Instruct", - "display_name": "Llama 3.2 1b Instruct", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1048576, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-18", - "last_updated": "2024-09-18", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "meta/llama-3.3-70b-instruct", - "name": "Llama 3.3 70b Instruct", - "display_name": "Llama 3.3 70b Instruct", + "id": "openai/gpt-oss-120b", + "name": "OpenAI GPT 120B", + "display_name": "OpenAI GPT 120B", "modalities": { "input": [ "text" @@ -16884,24 +18146,40 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 128072, + "output": 128072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-11-26", - "last_updated": "2024-11-26", + "knowledge": "2025-08", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "nvidia": { + "id": "nvidia", + "name": "Nvidia", + "display_name": "Nvidia", + "api": "https://integrate.api.nvidia.com/v1", + "doc": "https://docs.api.nvidia.com/nim/", + "models": [ { - "id": "meta/llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct", - "display_name": "Llama 3.2 3B Instruct", + "id": "microsoft/phi-4-mini-instruct", + "name": "Phi-4-Mini", + "display_name": "Phi-4-Mini", "modalities": { "input": [ "text" @@ -16911,28 +18189,28 @@ ] }, "limit": { - "context": 32768, - "output": 32000 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2024-09-18", + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "meta/llama-3.2-90b-vision-instruct", - "name": "Llama-3.2-90B-Vision-Instruct", - "display_name": "Llama-3.2-90B-Vision-Instruct", + "id": "microsoft/phi-4-multimodal-instruct", + "name": "Phi 4 Multimodal", + "display_name": "Phi 4 Multimodal", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -16940,51 +18218,50 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "attachment": false, + "open_weights": false, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "meta/esmfold", - "name": "esmfold", - "display_name": "esmfold", + "id": "nvidia/magpie-tts-zeroshot", + "name": "magpie-tts-zeroshot", + "display_name": "magpie-tts-zeroshot", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 8192, + "output": 4096 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-03-15", + "release_date": "2025-05-22", "last_updated": "2025-06-12", "type": "chat" }, { - "id": "meta/llama-3.1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "nvidia/nv-embedcode-7b-v1", + "name": "nv-embedcode-7b-v1", + "display_name": "nv-embedcode-7b-v1", "modalities": { "input": [ "text" @@ -16994,29 +18271,27 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 32768, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2025-03-17", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "meta/llama-3.2-11b-vision-instruct", - "name": "Llama 3.2 11b Vision Instruct", - "display_name": "Llama 3.2 11b Vision Instruct", + "id": "nvidia/studiovoice", + "name": "studiovoice", + "display_name": "studiovoice", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -17024,27 +18299,26 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-18", - "last_updated": "2024-09-18", + "release_date": "2024-10-03", + "last_updated": "2025-06-13", "type": "chat" }, { - "id": "meta/esm2-650m", - "name": "esm2-650m", - "display_name": "esm2-650m", + "id": "nvidia/sparsedrive", + "name": "sparsedrive", + "display_name": "sparsedrive", "modalities": { "input": [ - "text" + "video" ], "output": [ "text" @@ -17059,26 +18333,28 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-08-29", - "last_updated": "2025-03-10", + "release_date": "2025-03-18", + "last_updated": "2025-07-20", "type": "chat" }, { - "id": "poolside/laguna-xs-2.1", - "name": "Laguna XS 2.1", - "display_name": "Laguna XS 2.1", + "id": "nvidia/cosmos-reason2-8b", + "name": "Cosmos Reason2 8B", + "display_name": "Cosmos Reason2 8B", "modalities": { "input": [ - "text" - ], - "output": [ + "text", + "image", + "video" + ], + "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 16384 }, "temperature": true, @@ -17087,32 +18363,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "nvidia/nemotron-nano-12b-v2-vl", + "name": "Nemotron Nano 12B v2 VL", + "display_name": "Nemotron Nano 12B v2 VL", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -17122,26 +18395,46 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "nvidia/bevformer", + "name": "bevformer", + "display_name": "bevformer", + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-03-18", + "last_updated": "2025-07-20", + "type": "chat" + }, + { + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "nemotron-3-nano-30b-a3b", + "display_name": "nemotron-3-nano-30b-a3b", "modalities": { "input": [ "text" @@ -17151,8 +18444,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -17162,26 +18455,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-09", + "release_date": "2024-12", + "last_updated": "2024-12", "type": "chat" }, { - "id": "stepfun-ai/step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "nvidia/llama-3.3-nemotron-super-49b-v1.5", + "name": "Llama 3.3 Nemotron Super 49B v1.5", + "display_name": "Llama 3.3 Nemotron Super 49B v1.5", "modalities": { "input": [ "text" @@ -17191,8 +18478,8 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -17202,25 +18489,53 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-02", - "last_updated": "2026-02-02", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "stepfun-ai/step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "nvidia/cosmos-transfer2_5-2b", + "name": "cosmos-transfer2.5-2b", + "display_name": "cosmos-transfer2.5-2b", "modalities": { "input": [ "text", - "image" + "image", + "video" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "chat" + }, + { + "id": "nvidia/llama-3.1-nemotron-nano-8b-v1", + "name": "Llama 3.1 Nemotron Nano 8B v1", + "display_name": "Llama 3.1 Nemotron Nano 8B v1", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 131072, "output": 16384 }, "temperature": true, @@ -17229,16 +18544,43 @@ "supported": true, "default": true }, + "attachment": false, + "open_weights": true, + "release_date": "2025-03-18", + "last_updated": "2025-03-18", + "type": "chat" + }, + { + "id": "nvidia/active-speaker-detection", + "name": "Active Speaker Detection", + "display_name": "Active Speaker Detection", + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": true, - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "nvidia/usdvalidate", + "name": "usdvalidate", + "display_name": "usdvalidate", "modalities": { "input": [ "text" @@ -17248,49 +18590,62 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2024-07-24", + "last_updated": "2025-01-08", + "type": "chat" + }, + { + "id": "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", + "name": "llama-3.1-nemotron-safety-guard-8b-v3", + "display_name": "llama-3.1-nemotron-safety-guard-8b-v3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "nvidia/llama-3.3-nemotron-super-49b-v1", + "name": "Llama 3.3 Nemotron Super 49B v1", + "display_name": "Llama 3.3 Nemotron Super 49B v1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -17298,28 +18653,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-04-07", + "last_updated": "2025-04-07", "type": "chat" }, { - "id": "moonshotai/kimi-k2-instruct-0905", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", + "id": "nvidia/llama-3.1-nemotron-70b-instruct", + "name": "Llama 3.1 Nemotron 70B Instruct", + "display_name": "Llama 3.1 Nemotron 70B Instruct", "modalities": { "input": [ "text" @@ -17329,8 +18672,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -17339,15 +18682,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super", + "display_name": "Nemotron 3 Super", "modalities": { "input": [ "text" @@ -17357,8 +18699,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -17373,24 +18715,25 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-04", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "openai/whisper-large-v3", - "name": "Whisper Large v3", - "display_name": "Whisper Large v3", + "id": "nvidia/nemotron-3-content-safety", + "name": "nemotron-3-content-safety", + "display_name": "nemotron-3-content-safety", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, + "context": 128000, "output": 4096 }, "temperature": false, @@ -17400,15 +18743,43 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2023-09", - "release_date": "2023-09-01", - "last_updated": "2025-09-05", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS-120B", - "display_name": "GPT-OSS-120B", + "id": "nvidia/cosmos-transfer1-7b", + "name": "cosmos-transfer1-7b", + "display_name": "cosmos-transfer1-7b", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-06-13", + "last_updated": "2025-06-30", + "type": "chat" + }, + { + "id": "nvidia/llama-3.1-nemotron-ultra-253b-v1", + "name": "Llama 3.1 Nemotron Ultra 253B", + "display_name": "Llama 3.1 Nemotron Ultra 253B", "modalities": { "input": [ "text" @@ -17419,7 +18790,7 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -17427,22 +18798,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-08-04", - "last_updated": "2025-08-14", + "release_date": "2025-04-07", + "last_updated": "2025-04-07", "type": "chat" }, { - "id": "minimaxai/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "nvidia/llama-3_2-nemoretriever-300m-embed-v1", + "name": "llama-3_2-nemoretriever-300m-embed-v1", + "display_name": "llama-3_2-nemoretriever-300m-embed-v1", "modalities": { "input": [ "text" @@ -17452,49 +18817,38 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32768, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-04-11", + "release_date": "2025-07-24", + "last_updated": "2025-07-24", "type": "chat" }, { - "id": "minimaxai/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "name": "Nemotron 3 Nano Omni", + "display_name": "Nemotron 3 Nano Omni", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -17509,14 +18863,14 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "sarvamai/sarvam-m", - "name": "sarvam-m", - "display_name": "sarvam-m", + "id": "nvidia/gliner-pii", + "name": "gliner-pii", + "display_name": "gliner-pii", "modalities": { "input": [ "text" @@ -17527,32 +18881,23 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" - } - ] - }, - "nebius": { - "id": "nebius", - "name": "Nebius Token Factory", - "display_name": "Nebius Token Factory", - "api": "https://api.tokenfactory.nebius.com/v1", - "doc": "https://docs.tokenfactory.nebius.com/", - "models": [ + }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron-3-Super-120B-A12B", - "display_name": "Nemotron-3-Super-120B-A12B", + "id": "nvidia/rerank-qa-mistral-4b", + "name": "rerank-qa-mistral-4b", + "display_name": "rerank-qa-mistral-4b", "modalities": { "input": [ "text" @@ -17562,42 +18907,36 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 128000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2026-02", - "release_date": "2026-03-11", - "last_updated": "2026-03-12", + "release_date": "2024-03-17", + "last_updated": "2025-01-17", "type": "chat" }, { - "id": "nvidia/Nemotron-3-Nano-Omni", - "name": "Nemotron-3-Nano-Omni", - "display_name": "Nemotron-3-Nano-Omni", + "id": "nvidia/llama-3.1-nemotron-nano-vl-8b-v1", + "name": "Llama 3.1 Nemotron Nano VL 8B v1", + "display_name": "Llama 3.1 Nemotron Nano VL 8B v1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -17605,48 +18944,46 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-01-20", - "last_updated": "2026-05-07", + "release_date": "2025-04-10", + "last_updated": "2025-04-10", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", - "name": "Nemotron-3-Nano-30B-A3B", - "display_name": "Nemotron-3-Nano-30B-A3B", + "id": "nvidia/synthetic-video-detector", + "name": "synthetic-video-detector", + "display_name": "synthetic-video-detector", "modalities": { "input": [ - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, + "context": 8192, "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-08-10", - "last_updated": "2026-02-04", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", - "name": "Llama-3.1-Nemotron-Ultra-253B-v1", - "display_name": "Llama-3.1-Nemotron-Ultra-253B-v1", + "id": "nvidia/streampetr", + "name": "streampetr", + "display_name": "streampetr", "modalities": { "input": [ - "text" + "video" ], "output": [ "text" @@ -17654,35 +18991,34 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-15", - "last_updated": "2026-02-04", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma-3-27b-it", - "display_name": "Gemma-3-27b-it", + "id": "nvidia/nemotron-voicechat", + "name": "nemotron-voicechat", + "display_name": "nemotron-voicechat", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 110000, + "context": 128000, "output": 8192 }, "temperature": true, @@ -17692,55 +19028,42 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-10", - "release_date": "2026-01-20", - "last_updated": "2026-02-04", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "nvidia/llama-nemotron-embed-vl-1b-v2", + "name": "llama-nemotron-embed-vl-1b-v2", + "display_name": "llama-nemotron-embed-vl-1b-v2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 32768, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-03-01", - "last_updated": "2026-03-10", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-10", + "last_updated": "2026-02-10", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "nvidia/nvidia-nemotron-nano-9b-v2", + "name": "nvidia-nemotron-nano-9b-v2", + "display_name": "nvidia-nemotron-nano-9b-v2", "modalities": { "input": [ "text" @@ -17750,8 +19073,8 @@ ] }, "limit": { - "context": 432000, - "output": 432000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -17759,27 +19082,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-09", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "nvidia/riva-translate-4b-instruct-v1.1", + "name": "riva-translate-4b-instruct-v1_1", + "display_name": "riva-translate-4b-instruct-v1_1", "modalities": { "input": [ "text" @@ -17789,25 +19102,24 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 128000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-25", - "last_updated": "2025-10-04", + "open_weights": true, + "release_date": "2025-12-12", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", - "name": "Qwen3-Next-80B-A3B-Thinking-fast", - "display_name": "Qwen3-Next-80B-A3B-Thinking-fast", + "id": "nvidia/nemotron-content-safety-reasoning-4b", + "name": "nemotron-content-safety-reasoning-4b", + "display_name": "nemotron-content-safety-reasoning-4b", "modalities": { "input": [ "text" @@ -17817,37 +19129,25 @@ ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 128000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-25", - "last_updated": "2026-05-07", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", - "name": "Qwen3-235B-A22B-Thinking-2507-fast", - "display_name": "Qwen3-235B-A22B-Thinking-2507-fast", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -17857,8 +19157,8 @@ ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -17868,66 +19168,47 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-25", - "last_updated": "2026-05-07", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5-397B-A17B", - "display_name": "Qwen3.5-397B-A17B", + "id": "nvidia/llama-nemotron-rerank-vl-1b-v2", + "name": "llama-nemotron-rerank-vl-1b-v2", + "display_name": "llama-nemotron-rerank-vl-1b-v2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 128000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-15", - "last_updated": "2026-05-07", + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-8B", - "name": "Qwen3-Embedding-8B", - "display_name": "Qwen3-Embedding-8B", + "id": "nvidia/nv-embed-v1", + "name": "nv-embed-v1", + "display_name": "nv-embed-v1", "modalities": { "input": [ "text" @@ -17938,7 +19219,7 @@ }, "limit": { "context": 32768, - "output": 8192 + "output": 2048 }, "temperature": false, "tool_call": false, @@ -17947,15 +19228,43 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-10", - "release_date": "2026-01-10", - "last_updated": "2026-02-04", - "type": "embedding" + "release_date": "2024-06-07", + "last_updated": "2025-07-22", + "type": "chat" }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", - "name": "Qwen3-Next-80B-A3B-Thinking", - "display_name": "Qwen3-Next-80B-A3B-Thinking", + "id": "nvidia/cosmos-predict1-5b", + "name": "cosmos-predict1-5b", + "display_name": "cosmos-predict1-5b", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-03-18", + "last_updated": "2025-03-18", + "type": "chat" + }, + { + "id": "nvidia/nemotron-mini-4b-instruct", + "name": "nemotron-mini-4b-instruct", + "display_name": "nemotron-mini-4b-instruct", "modalities": { "input": [ "text" @@ -17966,36 +19275,23 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-01-28", - "last_updated": "2026-02-04", + "release_date": "2024-08-21", + "last_updated": "2024-08-26", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3-30B-A3B-Instruct-2507", - "display_name": "Qwen3-30B-A3B-Instruct-2507", + "id": "nvidia/usdcode", + "name": "usdcode", + "display_name": "usdcode", "modalities": { "input": [ "text" @@ -18006,24 +19302,23 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-01-28", - "last_updated": "2026-02-04", + "open_weights": false, + "release_date": "2026-01-01", + "last_updated": "2026-01-01", "type": "chat" }, { - "id": "Qwen/Qwen2.5-VL-72B-Instruct", - "name": "Qwen2.5-VL-72B-Instruct", - "display_name": "Qwen2.5-VL-72B-Instruct", + "id": "google/google-paligemma", + "name": "paligemma", + "display_name": "paligemma", "modalities": { "input": [ "text", @@ -18038,60 +19333,48 @@ "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-20", - "last_updated": "2026-02-04", + "release_date": "2024-05-14", + "last_updated": "2024-08-26", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3-32B", - "display_name": "Qwen3-32B", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-01-28", - "last_updated": "2026-02-04", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B-fast", - "name": "Qwen3.5-397B-A17B-fast", - "display_name": "Qwen3.5-397B-A17B-fast", + "id": "google/gemma-2-2b-it", + "name": "Gemma 2 2b It", + "display_name": "Gemma 2 2b It", "modalities": { "input": [ "text" @@ -18101,77 +19384,65 @@ ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-15", - "last_updated": "2026-05-07", + "release_date": "2024-07-16", + "last_updated": "2024-07-16", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5-fast", - "name": "MiniMax-M2.5-fast", - "display_name": "MiniMax-M2.5-fast", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-01-20", - "last_updated": "2026-05-07", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "google/gemma-4-31b-it", + "name": "Gemma-4-31B-IT", + "display_name": "Gemma-4-31B-IT", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 8192 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -18184,89 +19455,87 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-01-20", - "last_updated": "2026-05-07", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "google/gemma-3n-e4b-it", + "name": "Gemma 3n E4b It", + "display_name": "Gemma 3n E4b It", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2024-06", + "release_date": "2025-06-03", + "last_updated": "2025-06-03", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2-fast", - "name": "DeepSeek-V3.2-fast", - "display_name": "DeepSeek-V3.2-fast", + "id": "google/gemma-3n-e2b-it", + "name": "Gemma 3n E2b It", + "display_name": "Gemma 3n E2b It", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2026-05-07", + "knowledge": "2024-06", + "release_date": "2025-06-12", + "last_updated": "2025-06-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 163000, + "context": 1048576, "output": 16384 }, "temperature": true, @@ -18275,28 +19544,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-11", - "release_date": "2026-01-20", - "last_updated": "2026-02-04", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "baai/bge-m3", + "name": "BGE M3", + "display_name": "BGE M3", "modalities": { "input": [ "text" @@ -18306,37 +19563,24 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8192, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" + "release_date": "2024-01-30", + "last_updated": "2026-04-30", + "type": "embedding" }, { - "id": "NousResearch/Hermes-4-70B", - "name": "Hermes-4-70B", - "display_name": "Hermes-4-70B", + "id": "qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ "text" @@ -18346,77 +19590,53 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 66536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-11", - "release_date": "2026-01-30", - "last_updated": "2026-02-04", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "NousResearch/Hermes-4-405B", - "name": "Hermes-4-405B", - "display_name": "Hermes-4-405B", + "id": "qwen/qwen-image-edit", + "name": "Qwen Image Edit", + "display_name": "Qwen Image Edit", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, + "context": 8192, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-11", - "release_date": "2026-01-30", - "last_updated": "2026-02-04", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2025-08-19", + "last_updated": "2025-08-19", + "type": "imageGeneration" }, { - "id": "PrimeIntellect/INTELLECT-3", - "name": "INTELLECT-3", - "display_name": "INTELLECT-3", + "id": "qwen/qwen2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32b Instruct", + "display_name": "Qwen2.5 Coder 32b Instruct", "modalities": { "input": [ "text" @@ -18427,7 +19647,7 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 4096 }, "temperature": true, "tool_call": true, @@ -18436,56 +19656,42 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-10", - "release_date": "2026-01-25", - "last_updated": "2026-02-04", + "release_date": "2024-11-06", + "last_updated": "2024-11-06", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5-fast", - "name": "Kimi-K2.5-fast", - "display_name": "Kimi-K2.5-fast", + "id": "qwen/qwen-image", + "name": "Qwen Image", + "display_name": "Qwen Image", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 256000, + "context": 8192, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-12-15", - "last_updated": "2026-02-04", - "type": "chat" + "open_weights": false, + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "imageGeneration" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5-397B-A17B", + "display_name": "Qwen3.5-397B-A17B", "modalities": { "input": [ "text", @@ -18496,7 +19702,7 @@ ] }, "limit": { - "context": 256000, + "context": 262144, "output": 8192 }, "temperature": true, @@ -18518,18 +19724,21 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-12-15", - "last_updated": "2026-02-04", + "knowledge": "2026-01", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -18537,9 +19746,9 @@ }, "limit": { "context": 262144, - "output": 8000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -18556,17 +19765,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next-80B-A3B-Instruct", + "display_name": "Qwen3-Next-80B-A3B-Instruct", "modalities": { "input": [ "text" @@ -18576,36 +19784,25 @@ ] }, "limit": { - "context": 1048576, - "output": 8000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "openai/gpt-oss-120b-fast", - "name": "gpt-oss-120b-fast", - "display_name": "gpt-oss-120b-fast", + "id": "abacusai/dracarys-llama-3.1-70b-instruct", + "name": "dracarys-llama-3.1-70b-instruct", + "display_name": "dracarys-llama-3.1-70b-instruct", "modalities": { "input": [ "text" @@ -18615,26 +19812,24 @@ ] }, "limit": { - "context": 8000, + "context": 128000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-06-10", - "last_updated": "2026-05-07", + "release_date": "2024-09-11", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "upstage/solar-10.7b-instruct", + "name": "solar-10.7b-instruct", + "display_name": "solar-10.7b-instruct", "modalities": { "input": [ "text" @@ -18650,251 +19845,160 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-01-10", - "last_updated": "2026-02-04", + "release_date": "2024-06-05", + "last_updated": "2025-04-10", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "black-forest-labs/flux_2-klein-4b", + "name": "FLUX.2 Klein 4B", + "display_name": "FLUX.2 Klein 4B", "modalities": { "input": [ + "image", "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 40960, + "output": 40960 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-12-05", - "last_updated": "2026-02-04", + "knowledge": "2025-06", + "release_date": "2026-01-14", + "last_updated": "2026-01-31", "type": "chat" - } - ] - }, - "vivgrid": { - "id": "vivgrid", - "name": "Vivgrid", - "display_name": "Vivgrid", - "api": "https://api.vivgrid.com/v1", - "doc": "https://docs.vivgrid.com/models", - "models": [ + }, { - "id": "gpt-5.6-sol", - "name": "GPT 5.6 Sol", - "display_name": "GPT 5.6 Sol", + "id": "black-forest-labs/flux_1-schnell", + "name": "FLUX.1-schnell", + "display_name": "FLUX.1-schnell", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 77, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-08-01", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "black-forest-labs/flux_1-kontext-dev", + "name": "FLUX.1-Kontext-dev", + "display_name": "FLUX.1-Kontext-dev", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 40960, + "output": 40960 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "black-forest-labs/flux.1-dev", + "name": "FLUX.1-dev", + "display_name": "FLUX.1-dev", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 4096, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2024-08", + "release_date": "2024-08-01", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "mistralai/mistral-medium-3.5-128b", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "mistralai/mistral-nemotron", + "name": "mistral-nemotron", + "display_name": "mistral-nemotron", "modalities": { "input": [ "text" @@ -18904,90 +20008,51 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-06-11", + "last_updated": "2025-06-12", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "mistralai/mistral-medium-3-instruct", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "mistralai/mistral-small-4-119b-2603", + "name": "mistral-small-4-119b-2603", + "display_name": "mistral-small-4-119b-2603", "modalities": { "input": [ "text", @@ -18998,100 +20063,82 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "attachment": true, + "open_weights": true, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "mistralai/mistral-large-3-675b-instruct-2512", + "name": "Mistral Large 3 675B Instruct 2512", + "display_name": "Mistral Large 3 675B Instruct 2512", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "mistralai/ministral-14b-instruct-2512", + "name": "Ministral 3 14B Instruct 2512", + "display_name": "Ministral 3 14B Instruct 2512", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mistral: Mixtral 8x22B Instruct", + "display_name": "Mistral: Mixtral 8x22B Instruct", "modalities": { "input": [ "text" @@ -19101,290 +20148,163 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 65536, + "output": 13108 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2024-04-17", + "last_updated": "2024-04-17", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "mistralai/magistral-small-2506", + "name": "Magistral Small 2506", + "display_name": "Magistral Small 2506", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT 5.6 Luna", - "display_name": "GPT 5.6 Luna", + "id": "mistralai/mixtral-8x7b-instruct", + "name": "Mistral: Mixtral 8x7B Instruct", + "display_name": "Mistral: Mixtral 8x7B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2023-12-10", + "last_updated": "2026-03-15", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "mistralai/mistral-7b-instruct-v0.3", + "name": "Mistral-7B-Instruct-v0.3", + "display_name": "Mistral-7B-Instruct-v0.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "release_date": "2025-04-01", + "last_updated": "2025-04-01", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "bytedance/seed-oss-36b-instruct", + "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2025-09-04", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "meta/llama-3.1-70b-instruct", + "name": "Llama 3.1 70b Instruct", + "display_name": "Llama 3.1 70b Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2024-07-16", + "last_updated": "2024-07-16", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "meta/llama-4-maverick-17b-128e-instruct", + "name": "Llama 4 Maverick 17b 128e Instruct", + "display_name": "Llama 4 Maverick 17b 128e Instruct", "modalities": { "input": [ "text", @@ -19395,362 +20315,286 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": true, + "open_weights": true, + "knowledge": "2024-02", + "release_date": "2025-04-01", + "last_updated": "2025-04-01", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT 5.6 Terra", - "display_name": "GPT 5.6 Terra", + "id": "meta/llama-guard-4-12b", + "name": "Llama Guard 4 12B", + "display_name": "Llama Guard 4 12B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2025-04-05", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1b Instruct", + "display_name": "Llama 3.2 1b Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-18", + "last_updated": "2024-09-18", "type": "chat" - } - ] - }, - "google": { - "id": "google", - "name": "google", - "display_name": "google", - "doc": "https://ai.google.dev/gemini-api/docs/models", - "models": [ + }, { - "id": "gemini-2.5-computer-use-preview-10-2025", - "name": "Gemini 2.5 Computer Use Preview 10-2025", - "display_name": "Gemini 2.5 Computer Use Preview 10-2025", + "id": "meta/llama-3.3-70b-instruct", + "name": "Llama 3.3 70b Instruct", + "display_name": "Llama 3.3 70b Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-07", - "last_updated": "2025-10-07", + "attachment": false, + "open_weights": true, + "release_date": "2024-11-26", + "last_updated": "2024-11-26", "type": "chat" }, { - "id": "deep-research-preview-04-2026", - "name": "Deep Research Preview (Apr-21-2026)", - "display_name": "Deep Research Preview (Apr-21-2026)", + "id": "meta/llama-3.2-3b-instruct", + "name": "Llama 3.2 3B Instruct", + "display_name": "Llama 3.2 3B Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 32000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-09-18", + "last_updated": "2024-09-18", + "type": "chat" + }, + { + "id": "meta/llama-3.2-90b-vision-instruct", + "name": "Llama-3.2-90B-Vision-Instruct", + "display_name": "Llama-3.2-90B-Vision-Instruct", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "gemini-3.1-flash-tts-preview", - "name": "Gemini 3.1 Flash TTS Preview", - "display_name": "Gemini 3.1 Flash TTS Preview", + "id": "meta/esmfold", + "name": "esmfold", + "display_name": "esmfold", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 16384 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-15", - "last_updated": "2026-04-15", + "open_weights": true, + "release_date": "2024-03-15", + "last_updated": "2025-06-12", "type": "chat" }, { - "id": "gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "meta/llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gemini-embedding-2", - "name": "Gemini Embedding 2", - "display_name": "Gemini Embedding 2", + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11b Vision Instruct", + "display_name": "Llama 3.2 11b Vision Instruct", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 1 + "context": 128000, + "output": 4096 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "embedding" + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-18", + "last_updated": "2024-09-18", + "type": "chat" }, { - "id": "lyria-3-pro-preview", - "name": "Lyria 3 Pro Preview", - "display_name": "Lyria 3 Pro Preview", + "id": "meta/esm2-650m", + "name": "esm2-650m", + "display_name": "esm2-650m", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-25", - "last_updated": "2026-03-25", + "attachment": false, + "open_weights": true, + "release_date": "2024-08-29", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "poolside/laguna-xs-2.1", + "name": "Laguna XS 2.1", + "display_name": "Laguna XS 2.1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -19760,38 +20604,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "deepseek-ai/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -19799,61 +20627,39 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": -1, - "min": 0, - "max": 24576 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "search": { - "supported": true, - "default": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "deepseek-ai/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -19861,7 +20667,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 393216 }, "temperature": true, "tool_call": true, @@ -19871,123 +20677,135 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "lyria-3-clip-preview", - "name": "Lyria 3 Clip Preview", - "display_name": "Lyria 3 Clip Preview", + "id": "stepfun-ai/step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-25", - "last_updated": "2026-03-25", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-02", + "last_updated": "2026-02-02", "type": "chat" }, { - "id": "gemini-omni-flash-preview", - "name": "Gemini Omni Flash Preview", - "display_name": "Gemini Omni Flash Preview", + "id": "stepfun-ai/step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 256000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "veo-3.1-generate-preview", - "name": "Veo 3.1", - "display_name": "Veo 3.1", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2026-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deep-research-max-preview-04-2026", - "name": "Deep Research Max Preview (Apr-21-2026)", - "display_name": "Deep Research Max Preview (Apr-21-2026)", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -19995,80 +20813,67 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", "release_date": "2026-04-21", "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gemini-3-pro-image-preview", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "moonshotai/kimi-k2-instruct-0905", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20", - "type": "imageGeneration" + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -20081,61 +20886,55 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemini-3.5-live-translate-preview", - "name": "Gemini 3.5 Live Translate Preview", - "display_name": "Gemini 3.5 Live Translate Preview", + "id": "openai/whisper-large-v3", + "name": "Whisper Large v3", + "display_name": "Whisper Large v3", "modalities": { "input": [ "audio" ], "output": [ - "audio", "text" ] }, "limit": { - "context": 16384, - "output": 32768 + "context": 8192, + "output": 4096 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "knowledge": "2023-09", + "release_date": "2023-09-01", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS-120B", + "display_name": "GPT-OSS-120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -20145,49 +20944,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-08", + "release_date": "2025-08-04", + "last_updated": "2025-08-14", "type": "chat" }, { - "id": "gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "minimaxai/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -20198,44 +20979,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-04-11", "type": "chat" }, { - "id": "gemini-3.1-flash-lite-image", - "name": "Nano Banana 2 Lite", - "display_name": "Nano Banana 2 Lite", + "id": "minimaxai/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -20249,33 +21023,65 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", - "type": "imageGeneration" + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", + "type": "chat" }, { - "id": "gemini-3.1-flash-image-preview", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "sarvamai/sarvam-m", + "name": "sarvam-m", + "display_name": "sarvam-m", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", + "type": "chat" + } + ] + }, + "nebius": { + "id": "nebius", + "name": "Nebius Token Factory", + "display_name": "Nebius Token Factory", + "api": "https://api.tokenfactory.nebius.com/v1", + "doc": "https://docs.tokenfactory.nebius.com/", + "models": [ + { + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron-3-Super-120B-A12B", + "display_name": "Nemotron-3-Super-120B-A12B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -20285,31 +21091,28 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26", - "type": "imageGeneration" + "attachment": false, + "open_weights": true, + "knowledge": "2026-02", + "release_date": "2026-03-11", + "last_updated": "2026-03-12", + "type": "chat" }, { - "id": "gemini-robotics-er-1.6-preview", - "name": "Gemini Robotics-ER 1.6 Preview", - "display_name": "Gemini Robotics-ER 1.6 Preview", + "id": "nvidia/Nemotron-3-Nano-Omni", + "name": "Nemotron-3-Nano-Omni", + "display_name": "Nemotron-3-Nano-Omni", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -20317,51 +21120,45 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-14", - "last_updated": "2026-04-14", + "release_date": "2025-01-20", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", + "name": "Nemotron-3-Nano-30B-A3B", + "display_name": "Nemotron-3-Nano-30B-A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 32000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2025-08-10", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", + "name": "Llama-3.1-Nemotron-Ultra-253B-v1", + "display_name": "Llama-3.1-Nemotron-Ultra-253B-v1", "modalities": { "input": [ "text" @@ -20371,102 +21168,105 @@ ] }, "limit": { - "context": 2048, - "output": 1 + "context": 128000, + "output": 4096 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-15", + "last_updated": "2026-02-04", + "type": "chat" }, { - "id": "veo-3.1-lite-generate-preview", - "name": "Veo 3.1 lite", - "display_name": "Veo 3.1 lite", + "id": "google/gemma-3-27b-it", + "name": "Gemma-3-27b-it", + "display_name": "Gemma-3-27b-it", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, + "context": 110000, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "open_weights": true, + "knowledge": "2025-10", + "release_date": "2026-01-20", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "gemini-2.0-flash", - "name": "Gemini 2.0 Flash", - "display_name": "Gemini 2.0 Flash", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 200000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, - "search": { - "supported": true, - "default": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2026-01", + "release_date": "2026-03-01", + "last_updated": "2026-03-10", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 432000, + "output": 432000 }, "temperature": true, "tool_call": true, @@ -20477,77 +21277,63 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "veo-3.1-fast-generate-preview", - "name": "Veo 3.1 fast", - "display_name": "Veo 3.1 fast", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, + "context": 262144, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2026-01-01", + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", + "name": "Qwen3-Next-80B-A3B-Thinking-fast", + "display_name": "Qwen3-Next-80B-A3B-Thinking-fast", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -20557,32 +21343,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-25", "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", + "name": "Qwen3-235B-A22B-Thinking-2507-fast", + "display_name": "Qwen3-235B-A22B-Thinking-2507-fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 8000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -20592,131 +21383,108 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5-397B-A17B", + "display_name": "Qwen3.5-397B-A17B", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "imageGeneration" + "attachment": false, + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-15", + "last_updated": "2026-05-07", + "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "Gemini 2.5 Flash Image", - "display_name": "Gemini 2.5 Flash Image", + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen3-Embedding-8B", + "display_name": "Qwen3-Embedding-8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { "context": 32768, - "output": 32768 + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2025-10", + "release_date": "2026-01-10", + "last_updated": "2026-02-04", + "type": "embedding" }, { - "id": "gemini-2.5-flash-preview-tts", - "name": "Gemini 2.5 Flash Preview TTS", - "display_name": "Gemini 2.5 Flash Preview TTS", + "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "name": "Qwen3-Next-80B-A3B-Thinking", + "display_name": "Qwen3-Next-80B-A3B-Thinking", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, + "context": 128000, "output": 16384 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-05-01", - "last_updated": "2025-05-01", - "type": "chat" - }, - { - "id": "gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -20724,187 +21492,132 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "imageGeneration" + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2026-01-28", + "last_updated": "2026-02-04", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3-30B-A3B-Instruct-2507", + "display_name": "Qwen3-30B-A3B-Instruct-2507", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2026-01-28", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "Qwen/Qwen2.5-VL-72B-Instruct", + "name": "Qwen2.5-VL-72B-Instruct", + "display_name": "Qwen2.5-VL-72B-Instruct", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-20", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "Qwen/Qwen3-32B", + "name": "Qwen3-32B", + "display_name": "Qwen3-32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": -1, - "min": 128, - "max": 32768 - } + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "search": { - "supported": true, - "default": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2026-01-28", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "Qwen/Qwen3.5-397B-A17B-fast", + "name": "Qwen3.5-397B-A17B-fast", + "display_name": "Qwen3.5-397B-A17B-fast", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -20915,141 +21628,91 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-15", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", - "display_name": "Gemini 2.5 Flash Lite", + "id": "MiniMaxAI/MiniMax-M2.5-fast", + "name": "MiniMax-M2.5-fast", + "display_name": "MiniMax-M2.5-fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": -1, - "min": 512, - "max": 24576 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "search": { - "supported": true, - "default": false + "default": true }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-01-20", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-2.5-pro-preview-tts", - "name": "Gemini 2.5 Pro Preview TTS", - "display_name": "Gemini 2.5 Pro Preview TTS", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 16384 + "context": 196608, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-05-01", - "last_updated": "2025-05-01", + "release_date": "2025-01-20", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-2.0-flash-lite", - "name": "Gemini 2.0 Flash Lite", - "display_name": "Gemini 2.0 Flash Lite", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -21057,42 +21720,40 @@ }, "limit": { "context": 1048576, - "output": 8192 + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gemini-3.1-flash-live-preview", - "name": "Gemini 3.1 Flash Live Preview", - "display_name": "Gemini 3.1 Flash Live Preview", + "id": "deepseek-ai/DeepSeek-V3.2-fast", + "name": "DeepSeek-V3.2-fast", + "display_name": "DeepSeek-V3.2-fast", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 8000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21100,221 +21761,148 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-03-26", - "last_updated": "2026-03-26", + "release_date": "2025-01-27", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "Gemini 2.5 Flash Preview 09 2025", - "display_name": "Gemini 2.5 Flash Preview 09 2025", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 163000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": -1, - "min": 0, - "max": 24576 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "search": { - "supported": true, - "default": false - }, - "attachment": true, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-image-preview", - "name": "Gemini 2.5 Flash Image Preview", - "display_name": "Gemini 2.5 Flash Image Preview", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2025-11", + "release_date": "2026-01-20", + "last_updated": "2026-02-04", + "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "Gemini 2.5 Flash Lite Preview 09 2025", - "display_name": "Gemini 2.5 Flash Lite Preview 09 2025", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": -1, - "min": 512, - "max": 24576 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "search": { - "supported": true, - "default": false - }, - "attachment": true, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-2.0-flash-preview-image-generation", - "name": "Gemini 2.0 Flash Preview Image Generation", - "display_name": "Gemini 2.0 Flash Preview Image Generation", + "id": "NousResearch/Hermes-4-70B", + "name": "Hermes-4-70B", + "display_name": "Hermes-4-70B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32000, + "context": 128000, "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": true, + "attachment": false, + "open_weights": true, + "knowledge": "2025-11", + "release_date": "2026-01-30", + "last_updated": "2026-02-04", "type": "chat" - } - ] - }, - "thinkingmachines": { - "id": "thinkingmachines", - "name": "Thinking Machines", - "display_name": "Thinking Machines", - "api": "https://tinker.thinkingmachines.dev/services/tinker-prod/anthropic/api/v1", - "doc": "https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/", - "models": [ + }, { - "id": "thinkingmachines/Inkling:peft:262144", - "name": "Inkling (256K)", - "display_name": "Inkling (256K)", + "id": "NousResearch/Hermes-4-405B", + "name": "Hermes-4-405B", + "display_name": "Hermes-4-405B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21322,67 +21910,68 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2025-11", + "release_date": "2026-01-30", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "thinkingmachines/Inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "PrimeIntellect/INTELLECT-3", + "name": "INTELLECT-3", + "display_name": "INTELLECT-3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2025-10", + "release_date": "2026-01-25", + "last_updated": "2026-02-04", "type": "chat" - } - ] - }, - "lilac": { - "id": "lilac", - "name": "Lilac", - "display_name": "Lilac", - "api": "https://api.getlilac.com/v1", - "doc": "https://docs.getlilac.com/inference/models", - "models": [ + }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "moonshotai/Kimi-K2.5-fast", + "name": "Kimi-K2.5-fast", + "display_name": "Kimi-K2.5-fast", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262100, - "output": 262100 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21403,26 +21992,27 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-06", + "release_date": "2025-12-15", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "zai-org/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 524288 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21441,20 +22031,20 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-06", + "release_date": "2025-12-15", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -21462,9 +22052,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 8000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -21481,22 +22071,20 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "minimaxai/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -21504,9 +22092,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 8000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -21514,28 +22102,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - } - ] - }, - "stepfun-ai-step-plan": { - "id": "stepfun-ai-step-plan", - "name": "StepFun Step Plan (Global)", - "display_name": "StepFun Step Plan (Global)", - "api": "https://api.stepfun.ai/step_plan/v1", - "doc": "https://platform.stepfun.ai/docs/en/step-plan/integrations/reasoning-api", - "models": [ + }, { - "id": "step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "openai/gpt-oss-120b-fast", + "name": "gpt-oss-120b-fast", + "display_name": "gpt-oss-120b-fast", "modalities": { "input": [ "text" @@ -21545,8 +22130,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 8000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21554,41 +22139,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "knowledge": "2025-06", + "release_date": "2025-06-10", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "openai/gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21607,17 +22179,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "knowledge": "2025-09", + "release_date": "2026-01-10", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -21627,57 +22199,47 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08", + "release_date": "2025-12-05", + "last_updated": "2026-02-04", "type": "chat" } ] }, - "zhipuai-coding-plan": { - "id": "zhipuai-coding-plan", - "name": "Zhipu AI Coding Plan", - "display_name": "Zhipu AI Coding Plan", - "api": "https://open.bigmodel.cn/api/coding/paas/v4", - "doc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "vivgrid": { + "id": "vivgrid", + "name": "Vivgrid", + "display_name": "Vivgrid", + "api": "https://api.vivgrid.com/v1", + "doc": "https://docs.vivgrid.com/models", "models": [ { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "gpt-5.6-sol", + "name": "GPT 5.6 Sol", + "display_name": "GPT 5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -21688,38 +22250,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -21738,27 +22310,31 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -21768,38 +22344,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -21808,25 +22381,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "glm-5.2-highspeed", - "name": "GLM-5.2 Highspeed", - "display_name": "GLM-5.2 Highspeed", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -21837,7 +22420,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -21858,126 +22441,172 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" - } - ] - }, - "nano-gpt": { - "id": "nano-gpt", - "name": "NanoGPT", - "display_name": "NanoGPT", - "api": "https://nano-gpt.com/api/v1", - "doc": "https://docs.nano-gpt.com", - "models": [ + }, { - "id": "ernie-5.0-thinking-preview", - "name": "Ernie 5.0 Thinking Preview", - "display_name": "Ernie 5.0 Thinking Preview", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "Baichuan4-Turbo", - "name": "Baichuan 4 Turbo", - "display_name": "Baichuan 4 Turbo", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ "text" @@ -21988,125 +22617,203 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-19", - "last_updated": "2025-08-19", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "Gemma-4-31B-DarkIdol", - "name": "Gemma 4 31B DarkIdol", - "display_name": "Gemma 4 31B DarkIdol", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gpt-5.6-luna", + "name": "GPT 5.6 Luna", + "display_name": "GPT 5.6 Luna", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "step-2-16k-exp", - "name": "Step-2 16k Exp", - "display_name": "Step-2 16k Exp", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, "open_weights": false, - "release_date": "2024-07-05", - "last_updated": "2024-07-05", + "knowledge": "2025-08-31", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", - "name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", - "display_name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 272000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -22114,39 +22821,53 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "Qwen3.5-27B-earica-Derestricted", - "name": "Qwen3.5 27B earica Derestricted", - "display_name": "Qwen3.5 27B earica Derestricted", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -22154,24 +22875,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-06-17", - "name": "Gemini 2.5 Flash Lite Preview", - "display_name": "Gemini 2.5 Flash Lite Preview", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", @@ -22182,10 +22910,11 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": false @@ -22194,149 +22923,195 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-r1-sambanova", - "name": "DeepSeek R1 Fast", - "display_name": "DeepSeek R1 Fast", + "id": "gpt-5.6-terra", + "name": "GPT 5.6 Terra", + "display_name": "GPT 5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-02-20", - "last_updated": "2025-02-20", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "Gemma-4-31B-GarnetV2", - "name": "Gemma 4 31B Garnet V2", - "display_name": "Gemma 4 31B Garnet V2", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" - }, + } + ] + }, + "google": { + "id": "google", + "name": "google", + "display_name": "google", + "doc": "https://ai.google.dev/gemini-api/docs/models", + "models": [ { - "id": "claude-sonnet-4-thinking:8192", - "name": "Claude 4 Sonnet Thinking (8K)", - "display_name": "Claude 4 Sonnet Thinking (8K)", + "id": "gemini-2.5-computer-use-preview-10-2025", + "name": "Gemini 2.5 Computer Use Preview 10-2025", + "display_name": "Gemini 2.5 Computer Use Preview 10-2025", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-01", + "release_date": "2025-10-07", + "last_updated": "2025-10-07", "type": "chat" }, { - "id": "holo3-35b-a3b:thinking", - "name": "Holo3-35B-A3B Thinking", - "display_name": "Holo3-35B-A3B Thinking", + "id": "deep-research-preview-04-2026", + "name": "Deep Research Preview (Apr-21-2026)", + "display_name": "Deep Research Preview (Apr-21-2026)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 65536, + "context": 131072, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -22344,77 +23119,83 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "jamba-large-1.7", - "name": "Jamba Large 1.7", - "display_name": "Jamba Large 1.7", + "id": "gemini-3.1-flash-tts-preview", + "name": "Gemini 3.1 Flash TTS Preview", + "display_name": "Gemini 3.1 Flash TTS Preview", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 8192, + "output": 16384 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "knowledge": "2025-01", + "release_date": "2026-04-15", + "last_updated": "2026-04-15", "type": "chat" }, { - "id": "Gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-04-09", - "last_updated": "2026-04-09", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "doubao-1-5-thinking-pro-250415", - "name": "Doubao 1.5 Thinking Pro", - "display_name": "Doubao 1.5 Thinking Pro", + "id": "gemini-embedding-2", + "name": "Gemini Embedding 2", + "display_name": "Gemini Embedding 2", "modalities": { "input": [ "text", + "image", + "audio", + "video", "pdf" ], "output": [ @@ -22422,67 +23203,72 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 1 }, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-04-17", - "last_updated": "2025-04-17", - "type": "chat" + "knowledge": "2025-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "embedding" }, { - "id": "qwen3.5-omni-flash", - "name": "Qwen3.5 Omni Flash", - "display_name": "Qwen3.5 Omni Flash", + "id": "lyria-3-pro-preview", + "name": "Lyria 3 Pro Preview", + "display_name": "Lyria 3 Pro Preview", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 49152, - "output": 16384 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-03-30", + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", - "name": "Qwen3.5 27B Marvin DPO V2 Derestricted", - "display_name": "Qwen3.5 27B Marvin DPO V2 Derestricted", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -22490,248 +23276,266 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", - "name": "Qwen3.5 27B BlueStar v3 Derestricted Lite", - "display_name": "Qwen3.5 27B BlueStar v3 Derestricted Lite", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": -1, + "min": 0, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemini-exp-1206", - "name": "Gemini 2.0 Pro 1206", - "display_name": "Gemini 2.0 Pro 1206", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2097152, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "Qwen3.5-27B-Marvin-V2-Derestricted", - "name": "Qwen3.5 27B Marvin V2 Derestricted", - "display_name": "Qwen3.5 27B Marvin V2 Derestricted", + "id": "lyria-3-clip-preview", + "name": "Lyria 3 Clip Preview", + "display_name": "Lyria 3 Clip Preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "claude-sonnet-4-thinking:1024", - "name": "Claude 4 Sonnet Thinking (1K)", - "display_name": "Claude 4 Sonnet Thinking (1K)", + "id": "gemini-omni-flash-preview", + "name": "Gemini Omni Flash Preview", + "display_name": "Gemini Omni Flash Preview", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "hunyuan-turbos-20250226", - "name": "Hunyuan Turbo S", - "display_name": "Hunyuan Turbo S", + "id": "veo-3.1-generate-preview", + "name": "Veo 3.1", + "display_name": "Veo 3.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 24000, + "context": 480, "output": 8192 }, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "release_date": "2025-10-15", + "last_updated": "2026-01", "type": "chat" }, { - "id": "qwen3.7-max:thinking", - "name": "Qwen3.7 Max Thinking", - "display_name": "Qwen3.7 Max Thinking", + "id": "deep-research-max-preview-04-2026", + "name": "Deep Research Max Preview (Apr-21-2026)", + "display_name": "Deep Research Max Preview (Apr-21-2026)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, + "context": 131072, "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "Qwen3.5-27B-RpRMax-v1", - "name": "Qwen3.5 27B RpRMax v1", - "display_name": "Qwen3.5 27B RpRMax v1", + "id": "gemini-3-pro-image-preview", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -22740,55 +23544,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", - "type": "chat" - }, - { - "id": "doubao-1-5-thinking-pro-vision-250415", - "name": "Doubao 1.5 Thinking Pro Vision", - "display_name": "Doubao 1.5 Thinking Pro Vision", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "type": "imageGeneration" }, { - "id": "claude-opus-4-1-thinking:1024", - "name": "Claude 4.1 Opus Thinking (1K)", - "display_name": "Claude 4.1 Opus Thinking (1K)", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -22796,9 +23582,10 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -22806,65 +23593,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "KAT-Coder-Exp-72B-1010", - "name": "KAT Coder Exp 72B 1010", - "display_name": "KAT Coder Exp 72B 1010", + "id": "gemini-3.5-live-translate-preview", + "name": "Gemini 3.5 Live Translate Preview", + "display_name": "Gemini 3.5 Live Translate Preview", "modalities": { "input": [ - "text" + "audio" ], "output": [ + "audio", "text" ] }, "limit": { - "context": 128000, + "context": 16384, "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "knowledge": "2025-01", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "claw-high", - "name": "Claw High", - "display_name": "Claw High", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -22872,91 +23649,147 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "qwen-max", - "name": "Qwen 2.5 Max", - "display_name": "Qwen 2.5 Max", + "id": "gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-04-03", - "last_updated": "2024-04-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "holo3-35b-a3b", - "name": "Holo3-35B-A3B", - "display_name": "Holo3-35B-A3B", + "id": "gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 65536, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "imageGeneration" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "gemini-3.1-flash-image-preview", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048756, + "context": 65536, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -22964,60 +23797,86 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "imageGeneration" }, { - "id": "universal-summarizer", - "name": "Universal Summarizer", - "display_name": "Universal Summarizer", + "id": "gemini-robotics-er-1.6-preview", + "name": "Gemini Robotics-ER 1.6 Preview", + "display_name": "Gemini Robotics-ER 1.6 Preview", "modalities": { "input": [ + "text", + "image", + "video", + "audio" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-04-14", + "last_updated": "2026-04-14", + "type": "chat" + }, + { + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 262144, "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2023-05-01", - "last_updated": "2024-01-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "phi-4-mini-instruct", - "name": "Phi 4 Mini", - "display_name": "Phi 4 Mini", + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ "text" @@ -23027,104 +23886,105 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 2048, + "output": 1 }, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", - "type": "chat" + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "doubao-seed-1-6-250615", - "name": "Doubao Seed 1.6", - "display_name": "Doubao Seed 1.6", + "id": "veo-3.1-lite-generate-preview", + "name": "Veo 3.1 lite", + "display_name": "Veo 3.1 lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 480, + "output": 8192 }, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-06-15", - "last_updated": "2025-06-15", + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "qwen3.5-122b-a10b:thinking", - "name": "Qwen3.5 122B A10B Thinking", - "display_name": "Qwen3.5 122B A10B Thinking", + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "display_name": "Gemini 2.0 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 1048576, + "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "search": { + "supported": true, + "default": false }, "attachment": true, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "knowledge": "2024-06", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "Qwen3.5-27B-Writer-V2-Derestricted", - "name": "Qwen3.5 27B Writer V2 Derestricted", - "display_name": "Qwen3.5 27B Writer V2 Derestricted", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -23132,24 +23992,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "Qwen3.5-27B-earica-Derestricted-Lite", - "name": "Qwen3.5 27B earica Derestricted Lite", - "display_name": "Qwen3.5 27B earica Derestricted Lite", + "id": "veo-3.1-fast-generate-preview", + "name": "Veo 3.1 fast", + "display_name": "Veo 3.1 fast", "modalities": { "input": [ "text", @@ -23157,53 +24026,46 @@ "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 480, + "output": 8192 }, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2025-10-15", + "last_updated": "2026-01-01", "type": "chat" }, { - "id": "command-a-plus-05-2026", - "name": "Cohere Command A+ (05/2026)", - "display_name": "Cohere Command A+ (05/2026)", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -23215,19 +24077,19 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-05-22", - "last_updated": "2026-05-22", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "Qwen3.5-27B-BlueStar-Derestricted-Lite", - "name": "Qwen3.5 27B BlueStar Derestricted Lite", - "display_name": "Qwen3.5 27B BlueStar Derestricted Lite", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -23235,47 +24097,46 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-04-17", - "name": "Gemini 2.5 Flash Preview", - "display_name": "Gemini 2.5 Flash Preview", + "id": "gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048756, + "context": 65536, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -23283,123 +24144,93 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-17", - "last_updated": "2025-04-17", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "claude-sonnet-4-thinking:32768", - "name": "Claude 4 Sonnet Thinking (32K)", - "display_name": "Claude 4 Sonnet Thinking (32K)", + "id": "gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image", + "display_name": "Gemini 2.5 Flash Image", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 32768, + "output": 32768 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "imageGeneration" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "gemini-2.5-flash-preview-tts", + "name": "Gemini 2.5 Flash Preview TTS", + "display_name": "Gemini 2.5 Flash Preview TTS", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 8192, + "output": 16384 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-05-20:thinking", - "name": "Gemini 2.5 Flash 0520 Thinking", - "display_name": "Gemini 2.5 Flash 0520 Thinking", + "id": "gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048000, - "output": 65536 + "context": 131072, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -23409,15 +24240,12 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ @@ -23427,29 +24255,33 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "Qwen3.5-27B-Writer-V2-Derestricted-Lite", - "name": "Qwen3.5 27B Writer V2 Derestricted Lite", - "display_name": "Qwen3.5 27B Writer V2 Derestricted Lite", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -23457,109 +24289,128 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gemma-4-31B-K1-v5", - "name": "Gemma 4 31B K1 v5", - "display_name": "Gemma 4 31B K1 v5", + "id": "gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "jamba-large", - "name": "Jamba Large", - "display_name": "Jamba Large", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", - "type": "chat" - }, - { - "id": "fastgpt", - "name": "Web Answer", - "display_name": "Web Answer", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] + "supported": true, + "default": true, + "budget": { + "default": -1, + "min": 128, + "max": 32768 + } }, - "limit": { - "context": 32768, - "output": 32768 + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "tool_call": false, - "reasoning": { - "supported": false + "search": { + "supported": true, + "default": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2023-08-01", - "last_updated": "2024-01-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "claude-opus-4-thinking", - "name": "Claude 4 Opus Thinking", - "display_name": "Claude 4 Opus Thinking", + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -23567,9 +24418,10 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -23579,153 +24431,186 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "Qwen3.5-27B-Infracelestial", - "name": "Qwen3.5 27B Infracelestial", - "display_name": "Qwen3.5 27B Infracelestial", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "display_name": "Gemini 2.5 Flash Lite", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": -1, + "min": 512, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "gemini-2.5-pro-preview-tts", + "name": "Gemini 2.5 Pro Preview TTS", + "display_name": "Gemini 2.5 Pro Preview TTS", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 8192, + "output": 16384 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "knowledge": "2025-01", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", "type": "chat" }, { - "id": "step-r1-v-mini", - "name": "Step R1 V Mini", - "display_name": "Step R1 V Mini", + "id": "gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", + "display_name": "Gemini 2.0 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 1048576, + "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "search": { + "supported": false + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", + "knowledge": "2024-06", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "Qwen3.5-27B-BlueStar-Derestricted", - "name": "Qwen3.5 27B BlueStar Derestricted", - "display_name": "Qwen3.5 27B BlueStar Derestricted", + "id": "gemini-3.1-flash-live-preview", + "name": "Gemini 3.1 Flash Live Preview", + "display_name": "Gemini 3.1 Flash Live Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -23733,216 +24618,289 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "knowledge": "2025-01", + "release_date": "2026-03-26", + "last_updated": "2026-03-26", "type": "chat" }, { - "id": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", - "name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted", - "display_name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted", + "id": "gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview 09 2025", + "display_name": "Gemini 2.5 Flash Preview 09 2025", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": -1, + "min": 0, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", "type": "chat" }, { - "id": "gemma-4-31B-Larkspur-v0.5", - "name": "Gemma 4 31B Larkspur v0.5", - "display_name": "Gemma 4 31B Larkspur v0.5", + "id": "gemini-2.5-flash-image-preview", + "name": "Gemini 2.5 Flash Image Preview", + "display_name": "Gemini 2.5 Flash Image Preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 32768, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", - "type": "chat" + "attachment": false, + "type": "imageGeneration" }, { - "id": "deepseek-math-v2", - "name": "DeepSeek Math V2", - "display_name": "DeepSeek Math V2", + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "Gemini 2.5 Flash Lite Preview 09 2025", + "display_name": "Gemini 2.5 Flash Lite Preview 09 2025", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1048576, "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false, + "budget": { + "default": -1, + "min": 512, + "max": 24576 + } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-12-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "search": { + "supported": true, + "default": false + }, + "attachment": true, "type": "chat" }, { - "id": "glm-4-air-0111", - "name": "GLM 4 Air 0111", - "display_name": "GLM 4 Air 0111", + "id": "gemini-2.0-flash-preview-image-generation", + "name": "Gemini 2.0 Flash Preview Image Generation", + "display_name": "Gemini 2.0 Flash Preview Image Generation", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32000, + "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-01-11", - "last_updated": "2025-01-11", + "search": { + "supported": false + }, + "attachment": true, "type": "chat" - }, + } + ] + }, + "thinkingmachines": { + "id": "thinkingmachines", + "name": "Thinking Machines", + "display_name": "Thinking Machines", + "api": "https://tinker.thinkingmachines.dev/services/tinker-prod/anthropic/api/v1", + "doc": "https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/", + "models": [ { - "id": "learnlm-1.5-pro-experimental", - "name": "Gemini LearnLM Experimental", - "display_name": "Gemini LearnLM Experimental", + "id": "thinkingmachines/Inkling:peft:262144", + "name": "Inkling (256K)", + "display_name": "Inkling (256K)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32767, - "output": 8192 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-05-14", - "last_updated": "2024-05-14", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 65536, "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" - }, + } + ] + }, + "lilac": { + "id": "lilac", + "name": "Lilac", + "display_name": "Lilac", + "api": "https://api.getlilac.com/v1", + "doc": "https://docs.getlilac.com/inference/models", + "models": [ { - "id": "gemini-3-pro-image-preview", - "name": "Gemini 3 Pro Image", - "display_name": "Gemini 3 Pro Image", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 262100, + "output": 262100 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -23950,30 +24908,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-18", - "last_updated": "2025-11-18", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" }, { - "id": "doubao-1.5-pro-32k", - "name": "Doubao 1.5 Pro 32k", - "display_name": "Doubao 1.5 Pro 32k", + "id": "zai-org/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -23983,28 +24936,40 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 524288, + "output": 524288 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-22", - "last_updated": "2025-01-22", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Gemma-4-31B-Cognitive-Unshackled", - "name": "Gemma 4 31B Cognitive Unshackled", - "display_name": "Gemma 4 31B Cognitive Unshackled", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -24012,36 +24977,52 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "MiniMax-M2", - "name": "MiniMax M2", - "display_name": "MiniMax M2", + "id": "minimaxai/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -24051,16 +25032,25 @@ "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-10-25", - "last_updated": "2025-10-25", + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" - }, + } + ] + }, + "stepfun-ai-step-plan": { + "id": "stepfun-ai-step-plan", + "name": "StepFun Step Plan (Global)", + "display_name": "StepFun Step Plan (Global)", + "api": "https://api.stepfun.ai/step_plan/v1", + "doc": "https://platform.stepfun.ai/docs/en/step-plan/integrations/reasoning-api", + "models": [ { - "id": "deepseek-reasoner-cheaper", - "name": "Deepseek R1 Cheaper", - "display_name": "Deepseek R1 Cheaper", + "id": "step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ "text" @@ -24070,23 +25060,37 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 256000, + "output": 256000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "Qwen3.5-27B-Musica-v1", - "name": "Qwen3.5 27B Musica v1", - "display_name": "Qwen3.5 27B Musica v1", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", @@ -24098,10 +25102,11 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 256000, + "output": 256000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -24118,44 +25123,65 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "hermes-high", - "name": "Hermes High", - "display_name": "Hermes High", + "id": "step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "zhipuai-coding-plan": { + "id": "zhipuai-coding-plan", + "name": "Zhipu AI Coding Plan", + "display_name": "Zhipu AI Coding Plan", + "api": "https://open.bigmodel.cn/api/coding/paas/v4", + "doc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "models": [ { - "id": "azure-o1", - "name": "Azure o1", - "display_name": "Azure o1", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -24166,103 +25192,156 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2024-12-17", - "last_updated": "2024-12-17", + "release_date": "2026-03-27", + "last_updated": "2026-03-27", "type": "chat" }, { - "id": "qvq-max", - "name": "Qwen: QvQ Max", - "display_name": "Qwen: QvQ Max", + "id": "glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-28", - "last_updated": "2025-03-28", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "kimi-k2-instruct-fast", - "name": "Kimi K2 0711 Fast", - "display_name": "Kimi K2 0711 Fast", + "id": "glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 200000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "deepseek-chat-cheaper", - "name": "DeepSeek V3/Chat Cheaper", - "display_name": "DeepSeek V3/Chat Cheaper", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "sonar-deep-research", - "name": "Perplexity Deep Research", - "display_name": "Perplexity Deep Research", + "id": "glm-5.2-highspeed", + "name": "GLM-5.2 Highspeed", + "display_name": "GLM-5.2 Highspeed", "modalities": { "input": [ "text" @@ -24272,78 +25351,148 @@ ] }, "limit": { - "context": 60000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-25", - "last_updated": "2025-02-25", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3.5-omni-plus", - "name": "Qwen3.5 Omni Plus", - "display_name": "Qwen3.5 Omni Plus", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 128000, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-03-30", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" - }, + } + ] + }, + "nano-gpt": { + "id": "nano-gpt", + "name": "NanoGPT", + "display_name": "NanoGPT", + "api": "https://nano-gpt.com/api/v1", + "doc": "https://docs.nano-gpt.com", + "models": [ { - "id": "doubao-seed-2-0-mini-260215", - "name": "Doubao Seed 2.0 Mini", - "display_name": "Doubao Seed 2.0 Mini", + "id": "ernie-5.0-thinking-preview", + "name": "Ernie 5.0 Thinking Preview", + "display_name": "Ernie 5.0 Thinking Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 128000, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "MiniMax-M1", - "name": "MiniMax M1", - "display_name": "MiniMax M1", + "id": "Baichuan4-Turbo", + "name": "Baichuan 4 Turbo", + "display_name": "Baichuan 4 Turbo", "modalities": { "input": [ "text" @@ -24353,8 +25502,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32768 }, "tool_call": false, "reasoning": { @@ -24362,14 +25511,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-06-16", - "last_updated": "2025-06-16", + "release_date": "2025-08-19", + "last_updated": "2025-08-19", "type": "chat" }, { - "id": "qwen3.5-flash:thinking", - "name": "Qwen3.5 Flash Thinking", - "display_name": "Qwen3.5 Flash Thinking", + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", @@ -24384,32 +25533,27 @@ "context": 991808, "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "doubao-1.5-vision-pro-32k", - "name": "Doubao 1.5 Vision Pro 32k", - "display_name": "Doubao 1.5 Vision Pro 32k", + "id": "Gemma-4-31B-DarkIdol", + "name": "Gemma 4 31B DarkIdol", + "display_name": "Gemma 4 31B DarkIdol", "modalities": { "input": [ "text", @@ -24420,49 +25564,60 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-01-22", - "last_updated": "2025-01-22", + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "sonar", - "name": "Perplexity Simple", - "display_name": "Perplexity Simple", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 127000, - "output": 128000 + "context": 991808, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "glm-zero-preview", - "name": "GLM Zero Preview", - "display_name": "GLM Zero Preview", + "id": "step-2-16k-exp", + "name": "Step-2 16k Exp", + "display_name": "Step-2 16k Exp", "modalities": { "input": [ "text" @@ -24472,8 +25627,8 @@ ] }, "limit": { - "context": 8000, - "output": 4096 + "context": 16000, + "output": 8192 }, "tool_call": false, "reasoning": { @@ -24481,31 +25636,31 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "release_date": "2024-10-15", + "last_updated": "2024-07-05", "type": "chat" }, { - "id": "qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B", - "display_name": "Qwen3.5 35B A3B", + "id": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", + "name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", + "display_name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -24519,20 +25674,19 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "release_date": "2026-05-02", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "gemma-4-31B-MeroMero", - "name": "Gemma 4 31B MeroMero", - "display_name": "Gemma 4 31B MeroMero", + "id": "Qwen3.5-27B-earica-Derestricted", + "name": "Qwen3.5 27B earica Derestricted", + "display_name": "Qwen3.5 27B earica Derestricted", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -24547,73 +25701,32 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", - "type": "chat" - }, - { - "id": "sonar-pro", - "name": "Perplexity Pro", - "display_name": "Perplexity Pro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 128000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", - "type": "chat" - }, - { - "id": "glm-4-long", - "name": "GLM-4 Long", - "display_name": "GLM-4 Long", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": false, - "open_weights": false, - "release_date": "2024-08-01", - "last_updated": "2024-08-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gemini-2.5-flash-nothinking", - "name": "Gemini 2.5 Flash (No Thinking)", - "display_name": "Gemini 2.5 Flash (No Thinking)", + "id": "gemini-2.5-flash-lite-preview-06-17", + "name": "Gemini 2.5 Flash Lite Preview", + "display_name": "Gemini 2.5 Flash Lite Preview", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" @@ -24626,19 +25739,18 @@ "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "budget", "budget": { "default": -1, - "min": 0, + "min": 512, "max": 24576, "auto": -1, - "off": 0, "unit": "tokens" }, "summaries": true, @@ -24650,14 +25762,14 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "doubao-seed-2-0-pro-260215", - "name": "Doubao Seed 2.0 Pro", - "display_name": "Doubao Seed 2.0 Pro", + "id": "deepseek-r1-sambanova", + "name": "DeepSeek R1 Fast", + "display_name": "DeepSeek R1 Fast", "modalities": { "input": [ "text" @@ -24667,23 +25779,23 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 128000, + "output": 4096 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2025-02-20", + "last_updated": "2025-02-20", "type": "chat" }, { - "id": "gemini-2.0-pro-exp-02-05", - "name": "Gemini 2.0 Pro 0205", - "display_name": "Gemini 2.0 Pro 0205", + "id": "Gemma-4-31B-GarnetV2", + "name": "Gemma 4 31B Garnet V2", + "display_name": "Gemma 4 31B Garnet V2", "modalities": { "input": [ "text", @@ -24694,56 +25806,24 @@ ] }, "limit": { - "context": 2097152, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2025-02-05", - "type": "chat" - }, - { - "id": "ernie-5.1", - "name": "ERNIE 5.1", - "display_name": "ERNIE 5.1", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 119000, - "output": 64000 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-10", - "last_updated": "2026-05-10", + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "claude-opus-4-5-20251101:thinking", - "name": "Claude 4.5 Opus Thinking", - "display_name": "Claude 4.5 Opus Thinking", + "id": "claude-sonnet-4-thinking:8192", + "name": "Claude 4 Sonnet Thinking (8K)", + "display_name": "Claude 4 Sonnet Thinking (8K)", "modalities": { "input": [ "text", @@ -24755,9 +25835,10 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -24767,17 +25848,11 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -24785,21 +25860,22 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "exa-research-pro", - "name": "Exa (Research Pro)", - "display_name": "Exa (Research Pro)", + "id": "qwen3.8-max-preview", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ "text" @@ -24809,49 +25885,58 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 991000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2025-06-04", - "last_updated": "2025-06-04", + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "exa-answer", - "name": "Exa (Answer)", - "display_name": "Exa (Answer)", + "id": "holo3-35b-a3b:thinking", + "name": "Holo3-35B-A3B Thinking", + "display_name": "Holo3-35B-A3B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 65536, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-06-04", - "last_updated": "2025-06-04", + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "doubao-seed-2-0-lite-260215", - "name": "Doubao Seed 2.0 Lite", - "display_name": "Doubao Seed 2.0 Lite", + "id": "jamba-large-1.7", + "name": "Jamba Large 1.7", + "display_name": "Jamba Large 1.7", "modalities": { "input": [ "text" @@ -24862,54 +25947,51 @@ }, "limit": { "context": 256000, - "output": 32000 + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "gemini-2.0-flash-001", - "name": "Gemini 2.0 Flash", - "display_name": "Gemini 2.0 Flash", + "id": "qwen3.5-omni-flash", + "name": "Qwen3.5 Omni Flash", + "display_name": "Qwen3.5 Omni Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 8192 + "context": 49152, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-03-30", + "last_updated": "2026-03-30", "type": "chat" }, { - "id": "ernie-x1-32k", - "name": "Ernie X1 32k", - "display_name": "Ernie X1 32k", + "id": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", + "name": "Qwen3.5 27B Marvin DPO V2 Derestricted", + "display_name": "Qwen3.5 27B Marvin DPO V2 Derestricted", "modalities": { "input": [ "text", @@ -24920,86 +26002,49 @@ ] }, "limit": { - "context": 32000, + "context": 262144, "output": 16384 }, "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-08", - "last_updated": "2025-05-08", - "type": "chat" - }, - { - "id": "gemini-2.5-flash-lite-preview-09-2025-thinking", - "name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", - "display_name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048756, - "output": 65536 - }, - "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025-thinking", - "name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", - "display_name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", + "id": "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", + "name": "Qwen3.5 27B BlueStar v3 Derestricted Lite", + "display_name": "Qwen3.5 27B BlueStar v3 Derestricted Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 262144, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -25007,169 +26052,107 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "azure-gpt-4o", - "name": "Azure gpt-4o", - "display_name": "Azure gpt-4o", + "id": "gemini-exp-1206", + "name": "Gemini 2.0 Pro 1206", + "display_name": "Gemini 2.0 Pro 1206", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 2097152, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "ernie-5.1:thinking", - "name": "ERNIE 5.1 Thinking", - "display_name": "ERNIE 5.1 Thinking", + "id": "Qwen3.5-27B-Marvin-V2-Derestricted", + "name": "Qwen3.5 27B Marvin V2 Derestricted", + "display_name": "Qwen3.5 27B Marvin V2 Derestricted", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 119000, - "output": 64000 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-10", - "last_updated": "2026-05-10", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gemini-2.0-pro-reasoner", - "name": "Gemini 2.0 Pro Reasoner", - "display_name": "Gemini 2.0 Pro Reasoner", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 65536 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2025-02-05", - "type": "chat" - }, - { - "id": "qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 991808, - "output": 65536 - }, - "tool_call": false, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", - "type": "chat" - }, - { - "id": "Qwen3.5-27B-BlueStar-v2-Derestricted", - "name": "Qwen3.5 27B BlueStar v2 Derestricted", - "display_name": "Qwen3.5 27B BlueStar v2 Derestricted", + "id": "claude-sonnet-4-thinking:1024", + "name": "Claude 4 Sonnet Thinking (1K)", + "display_name": "Claude 4 Sonnet Thinking (1K)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -25177,24 +26160,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gemini-2.0-flash-thinking-exp-1219", - "name": "Gemini 2.0 Flash Thinking 1219", - "display_name": "Gemini 2.0 Flash Thinking 1219", + "id": "pokee-isaac", + "name": "Pokee-Isaac 28B", + "display_name": "Pokee-Isaac 28B", "modalities": { "input": [ "text" @@ -25204,90 +26198,50 @@ ] }, "limit": { - "context": 32767, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-12-19", - "last_updated": "2024-12-19", - "type": "chat" - }, - { - "id": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", - "name": "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", - "display_name": "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 + "context": 10000000, + "output": 60000 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2026-08-04", + "last_updated": "2026-08-04", "type": "chat" }, { - "id": "deepclaude", - "name": "DeepClaude", - "display_name": "DeepClaude", + "id": "hunyuan-turbos-20250226", + "name": "Hunyuan Turbo S", + "display_name": "Hunyuan Turbo S", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 24000, "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-02-01", - "last_updated": "2025-02-01", + "release_date": "2025-02-27", + "last_updated": "2025-02-27", "type": "chat" }, { - "id": "glm-4-plus-0111", - "name": "GLM 4 Plus 0111", - "display_name": "GLM 4 Plus 0111", + "id": "qwen3.7-max:thinking", + "name": "Qwen3.7 Max Thinking", + "display_name": "Qwen3.7 Max Thinking", "modalities": { "input": [ "text" @@ -25297,28 +26251,29 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "Qwen3.5-27B-NaNovel-Derestricted-Lite", - "name": "Qwen3.5 27B NaNovel Derestricted Lite", - "display_name": "Qwen3.5 27B NaNovel Derestricted Lite", + "id": "Qwen3.5-27B-RpRMax-v1", + "name": "Qwen3.5 27B RpRMax v1", + "display_name": "Qwen3.5 27B RpRMax v1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -25345,41 +26300,67 @@ } }, "attachment": true, - "open_weights": false, + "open_weights": true, "release_date": "2026-04-30", "last_updated": "2026-04-30", "type": "chat" }, { - "id": "ernie-x1-32k-preview", - "name": "Ernie X1 32k", - "display_name": "Ernie X1 32k", + "id": "claude-opus-4-1-thinking:1024", + "name": "Claude 4.1 Opus Thinking (1K)", + "display_name": "Claude 4.1 Opus Thinking (1K)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 200000, + "output": 32000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-03", - "last_updated": "2025-04-03", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "Gemini 2.5 Flash Preview (09/2025)", - "display_name": "Gemini 2.5 Flash Preview (09/2025)", + "id": "claw-high", + "name": "Claw High", + "display_name": "Claw High", "modalities": { "input": [ "text", @@ -25391,44 +26372,24 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 1000000, + "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "GLM-4.6-Derestricted-v5", - "name": "GLM 4.6 Derestricted v5", - "display_name": "GLM 4.6 Derestricted v5", + "id": "qwen-max", + "name": "Qwen 2.5 Max", + "display_name": "Qwen 2.5 Max", "modalities": { "input": [ "text" @@ -25438,103 +26399,88 @@ ] }, "limit": { - "context": 131072, + "context": 32000, "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "claude-opus-4-thinking:1024", - "name": "Claude 4 Opus Thinking (1K)", - "display_name": "Claude 4 Opus Thinking (1K)", + "id": "holo3-35b-a3b", + "name": "Holo3-35B-A3B", + "display_name": "Holo3-35B-A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 65536, + "output": 65536 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "auto-model-standard", - "name": "Auto model (Standard)", - "display_name": "Auto model (Standard)", + "id": "gemma-4-e4b-it", + "name": "Gemma 4 E4B Instruct", + "display_name": "Gemma 4 E4B Instruct", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 131072, + "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gemini-2.5-pro-exp-03-25", - "name": "Gemini 2.5 Pro Experimental 0325", - "display_name": "Gemini 2.5 Pro Experimental 0325", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" @@ -25544,6 +26490,7 @@ "context": 1048756, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -25556,9 +26503,10 @@ "mode": "budget", "budget": { "default": -1, - "min": 128, - "max": 32768, + "min": 0, + "max": 24576, "auto": -1, + "off": 0, "unit": "tokens" }, "summaries": true, @@ -25570,43 +26518,41 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen3.5-27b:thinking", - "name": "Qwen3.5 27B Thinking", - "display_name": "Qwen3.5 27B Thinking", + "id": "universal-summarizer", + "name": "Universal Summarizer", + "display_name": "Universal Summarizer", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 32768, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2025-12-23", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "glm-4-plus", - "name": "GLM-4 Plus", - "display_name": "GLM-4 Plus", + "id": "phi-4-mini-instruct", + "name": "Phi 4 Mini", + "display_name": "Phi 4 Mini", "modalities": { "input": [ "text" @@ -25617,22 +26563,22 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-08-01", - "last_updated": "2024-08-01", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "auto-model-premium", - "name": "Auto model (Premium)", - "display_name": "Auto model (Premium)", + "id": "mercury-coder-small", + "name": "Mercury Coder Small", + "display_name": "Mercury Coder Small", "modalities": { "input": [ "text" @@ -25642,8 +26588,8 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 32768, + "output": 16384 }, "tool_call": false, "reasoning": { @@ -25651,14 +26597,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "brave-research", - "name": "Brave (Research)", - "display_name": "Brave (Research)", + "id": "doubao-seed-1-6-250615", + "name": "Doubao Seed 1.6", + "display_name": "Doubao Seed 1.6", "modalities": { "input": [ "text" @@ -25668,7 +26614,7 @@ ] }, "limit": { - "context": 16384, + "context": 256000, "output": 16384 }, "tool_call": false, @@ -25677,29 +26623,28 @@ }, "attachment": false, "open_weights": false, - "release_date": "2023-03-02", - "last_updated": "2024-01-01", + "release_date": "2024-01-01", + "last_updated": "2025-06-15", "type": "chat" }, { - "id": "Qwen3.5-27B-Writer-Derestricted", - "name": "Qwen3.5 27B Writer Derestricted", - "display_name": "Qwen3.5 27B Writer Derestricted", + "id": "qwen3.5-122b-a10b:thinking", + "name": "Qwen3.5 122B A10B Thinking", + "display_name": "Qwen3.5 122B A10B Thinking", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -25715,42 +26660,16 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", - "type": "chat" - }, - { - "id": "azure-o3-mini", - "name": "Azure o3-mini", - "display_name": "Azure o3-mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 65536 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-instruct-original", - "name": "Qwen3 VL 235B A22B Instruct Original", - "display_name": "Qwen3 VL 235B A22B Instruct Original", + "id": "Qwen3.5-27B-Writer-V2-Derestricted", + "name": "Qwen3.5 27B Writer V2 Derestricted", + "display_name": "Qwen3.5 27B Writer V2 Derestricted", "modalities": { "input": [ "text", @@ -25761,106 +26680,113 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "Qwen3.5-27B-earica-Derestricted-Lite", + "name": "Qwen3.5 27B earica Derestricted Lite", + "display_name": "Qwen3.5 27B earica Derestricted Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "ernie-x1-turbo-32k", - "name": "Ernie X1 Turbo 32k", - "display_name": "Ernie X1 Turbo 32k", + "id": "command-a-plus-05-2026", + "name": "Cohere Command A+ (05/2026)", + "display_name": "Cohere Command A+ (05/2026)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 128000, + "output": 64000 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-08", - "last_updated": "2025-05-08", + "open_weights": true, + "knowledge": "2025-04-01", + "release_date": "2026-05-20", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", - "name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted", - "display_name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted", + "id": "Qwen3.5-27B-BlueStar-Derestricted-Lite", + "name": "Qwen3.5 27B BlueStar Derestricted Lite", + "display_name": "Qwen3.5 27B BlueStar Derestricted Lite", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -25887,81 +26813,28 @@ } }, "attachment": true, - "open_weights": false, + "open_weights": true, "release_date": "2026-04-06", "last_updated": "2026-04-06", "type": "chat" }, { - "id": "deepseek-v3-0324", - "name": "DeepSeek Chat 0324", - "display_name": "DeepSeek Chat 0324", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", - "type": "chat" - }, - { - "id": "mirothinker-1-7-deepresearch-mini", - "name": "MiroThinker 1.7 Deep Research Mini", - "display_name": "MiroThinker 1.7 Deep Research Mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", - "type": "chat" - }, - { - "id": "Qwen3.5-27B-Vivid-Durian", - "name": "Qwen3.5 27B Vivid Durian", - "display_name": "Qwen3.5 27B Vivid Durian", + "id": "gemini-2.5-flash-preview-04-17", + "name": "Gemini 2.5 Flash Preview", + "display_name": "Gemini 2.5 Flash Preview", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048756, + "output": 65536 }, "tool_call": false, "reasoning": { @@ -25971,24 +26844,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude 4.5 Opus", - "display_name": "Claude 4.5 Opus", + "id": "claude-sonnet-4-thinking:32768", + "name": "Claude 4 Sonnet Thinking (32K)", + "display_name": "Claude 4 Sonnet Thinking (32K)", "modalities": { "input": [ "text", @@ -26000,29 +26882,24 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", + "default_enabled": true, + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -26030,21 +26907,22 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "command-a-reasoning-08-2025", - "name": "Cohere Command A (08/2025)", - "display_name": "Cohere Command A (08/2025)", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ "text" @@ -26054,139 +26932,112 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 128000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-22", - "last_updated": "2025-08-22", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwq-32b", - "name": "Qwen: QwQ 32B", - "display_name": "Qwen: QwQ 32B", + "id": "gemini-2.5-flash-preview-05-20:thinking", + "name": "Gemini 2.5 Flash 0520 Thinking", + "display_name": "Gemini 2.5 Flash 0520 Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048000, + "output": 65536 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "chat" - }, - { - "id": "jamba-mini", - "name": "Jamba Mini", - "display_name": "Jamba Mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", - "type": "chat" - }, - { - "id": "Qwen2.5-32B-EVA-v0.2", - "name": "Qwen 2.5 32b EVA", - "display_name": "Qwen 2.5 32b EVA", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 24576, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-09-01", - "last_updated": "2024-09-01", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "asi1-mini", - "name": "ASI1 Mini", - "display_name": "ASI1 Mini", + "id": "Qwen3.5-27B-Writer-V2-Derestricted-Lite", + "name": "Qwen3.5 27B Writer V2 Derestricted Lite", + "display_name": "Qwen3.5 27B Writer V2 Derestricted Lite", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 262144, "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "glm-4-flash", - "name": "GLM-4 Flash", - "display_name": "GLM-4 Flash", + "id": "jamba-large", + "name": "Jamba Large", + "display_name": "Jamba Large", "modalities": { "input": [ "text" @@ -26196,7 +27047,7 @@ ] }, "limit": { - "context": 128000, + "context": 256000, "output": 4096 }, "tool_call": false, @@ -26205,14 +27056,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-08-01", - "last_updated": "2024-08-01", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "glm-4-air", - "name": "GLM-4 Air", - "display_name": "GLM-4 Air", + "id": "fastgpt", + "name": "Web Answer", + "display_name": "Web Answer", "modalities": { "input": [ "text" @@ -26222,8 +27073,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32768, + "output": 32768 }, "tool_call": false, "reasoning": { @@ -26231,14 +27082,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-06-05", - "last_updated": "2024-06-05", + "release_date": "2025-12-23", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "claude-opus-4-thinking:8192", - "name": "Claude 4 Opus Thinking (8K)", - "display_name": "Claude 4 Opus Thinking (8K)", + "id": "claude-opus-4-thinking", + "name": "Claude 4 Opus Thinking", + "display_name": "Claude 4 Opus Thinking", "modalities": { "input": [ "text", @@ -26253,6 +27104,7 @@ "context": 200000, "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -26281,19 +27133,19 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-03-31", "release_date": "2025-05-22", "last_updated": "2025-05-22", "type": "chat" }, { - "id": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", - "name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", - "display_name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", + "id": "Qwen3.5-27B-Infracelestial", + "name": "Qwen3.5 27B Infracelestial", + "display_name": "Qwen3.5 27B Infracelestial", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -26308,16 +27160,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", - "name": "Qwen3.5 27B BlueStar v2 Derestricted Lite", - "display_name": "Qwen3.5 27B BlueStar v2 Derestricted Lite", + "id": "qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", @@ -26329,13 +27192,13 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 260096, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -26349,15 +27212,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistral-code-agent-latest", - "name": "Mistral Code Agent Latest", - "display_name": "Mistral Code Agent Latest", + "id": "step-r1-v-mini", + "name": "Step R1 V Mini", + "display_name": "Step R1 V Mini", "modalities": { "input": [ "text" @@ -26367,38 +27230,37 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2024-01-01", + "last_updated": "2025-04-08", "type": "chat" }, { - "id": "claude-opus-4-thinking:32768", - "name": "Claude 4 Opus Thinking (32K)", - "display_name": "Claude 4 Opus Thinking (32K)", + "id": "Qwen3.5-27B-BlueStar-Derestricted", + "name": "Qwen3.5 27B BlueStar Derestricted", + "display_name": "Qwen3.5 27B BlueStar Derestricted", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -26406,39 +27268,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "Qwen3.5-27B-Queen-Derestricted", - "name": "Qwen3.5 27B Queen Derestricted", - "display_name": "Qwen3.5 27B Queen Derestricted", + "id": "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", + "name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted", + "display_name": "Qwen3.5 27B Omega Evolution v2.2 Derestricted", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -26465,15 +27316,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": true, + "release_date": "2026-05-02", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "Baichuan4-Air", - "name": "Baichuan 4 Air", - "display_name": "Baichuan 4 Air", + "id": "glm-4-air-0111", + "name": "GLM 4 Air 0111", + "display_name": "GLM 4 Air 0111", "modalities": { "input": [ "text" @@ -26483,8 +27334,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 128000, + "output": 4096 }, "tool_call": false, "reasoning": { @@ -26492,120 +27343,120 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-08-19", - "last_updated": "2025-08-19", + "release_date": "2025-01-11", + "last_updated": "2025-01-11", "type": "chat" }, { - "id": "claude-sonnet-4-thinking:64000", - "name": "Claude 4 Sonnet Thinking (64K)", - "display_name": "Claude 4 Sonnet Thinking (64K)", + "id": "learnlm-1.5-pro-experimental", + "name": "Gemini LearnLM Experimental", + "display_name": "Gemini LearnLM Experimental", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 32767, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2024-01-01", + "last_updated": "2024-05-14", "type": "chat" }, { - "id": "claw-low", - "name": "Claw Low", - "display_name": "Claw Low", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "qwen-long", - "name": "Qwen Long 10M", - "display_name": "Qwen Long 10M", + "id": "gemini-3-pro-image-preview", + "name": "Gemini 3 Pro Image", + "display_name": "Gemini 3 Pro Image", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 10000000, - "output": 8192 + "context": 1048756, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-01-25", - "last_updated": "2025-01-25", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "type": "imageGeneration" }, { - "id": "auto-model", - "name": "Auto model", - "display_name": "Auto model", + "id": "doubao-1.5-pro-32k", + "name": "Doubao 1.5 Pro 32k", + "display_name": "Doubao 1.5 Pro 32k", "modalities": { "input": [ "text" @@ -26615,8 +27466,8 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 32000, + "output": 8192 }, "tool_call": false, "reasoning": { @@ -26624,54 +27475,55 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "release_date": "2024-11-20", + "last_updated": "2025-01-22", "type": "chat" }, { - "id": "KAT-Coder-Air-V1", - "name": "KAT Coder Air V1", - "display_name": "KAT Coder Air V1", + "id": "Gemma-4-31B-Cognitive-Unshackled", + "name": "Gemma 4 31B Cognitive Unshackled", + "display_name": "Gemma 4 31B Cognitive Unshackled", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "attachment": true, + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "Qwen3.5-27B-NaNovel-Derestricted", - "name": "Qwen3.5 27B NaNovel Derestricted", - "display_name": "Qwen3.5 27B NaNovel Derestricted", + "id": "MiniMax-M2", + "name": "MiniMax M2", + "display_name": "MiniMax M2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 131072 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -26679,29 +27531,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "azure-gpt-4o-mini", - "name": "Azure gpt-4o-mini", - "display_name": "Azure gpt-4o-mini", + "id": "deepseek-reasoner-cheaper", + "name": "Deepseek R1 Cheaper", + "display_name": "Deepseek R1 Cheaper", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -26709,37 +27554,36 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001-thinking", - "name": "Claude Haiku 4.5 Thinking", - "display_name": "Claude Haiku 4.5 Thinking", + "id": "Qwen3.5-27B-Musica-v1", + "name": "Qwen3.5 27B Musica v1", + "display_name": "Qwen3.5 27B Musica v1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -26747,34 +27591,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-03-27", + "last_updated": "2026-03-27", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929-thinking", - "name": "Claude Sonnet 4.5 Thinking", - "display_name": "Claude Sonnet 4.5 Thinking", + "id": "hermes-high", + "name": "Hermes High", + "display_name": "Hermes High", "modalities": { "input": [ "text", @@ -26787,44 +27621,23 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "azure-o1", + "name": "Azure o1", + "display_name": "Azure o1", "modalities": { "input": [ "text" @@ -26834,35 +27647,23 @@ ] }, "limit": { - "context": 995904, - "output": 32768 + "context": 200000, + "output": 100000 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", + "release_date": "2024-01-01", + "last_updated": "2024-12-17", "type": "chat" }, { - "id": "gemini-2.5-pro-preview-05-06", - "name": "Gemini 2.5 Pro Preview 0506", - "display_name": "Gemini 2.5 Pro Preview 0506", + "id": "qvq-max", + "name": "Qwen: QvQ Max", + "display_name": "Qwen: QvQ Max", "modalities": { "input": [ "text", @@ -26873,73 +27674,53 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 128000, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-06", - "last_updated": "2025-05-06", + "open_weights": true, + "release_date": "2025-03-28", + "last_updated": "2025-03-28", "type": "chat" }, { - "id": "doubao-seed-1-6-thinking-250615", - "name": "Doubao Seed 1.6 Thinking", - "display_name": "Doubao Seed 1.6 Thinking", + "id": "kimi-k2-instruct-fast", + "name": "Kimi K2 0711 Fast", + "display_name": "Kimi K2 0711 Fast", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 131072, "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-06-15", - "last_updated": "2025-06-15", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "claude-opus-4-1-thinking:8192", - "name": "Claude 4.1 Opus Thinking (8K)", - "display_name": "Claude 4.1 Opus Thinking (8K)", + "id": "deepseek-chat-cheaper", + "name": "DeepSeek V3/Chat Cheaper", + "display_name": "DeepSeek V3/Chat Cheaper", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -26947,45 +27728,23 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 128000, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "Magistral-Small-2506", - "name": "Magistral Small 2506", - "display_name": "Magistral Small 2506", + "id": "sonar-deep-research", + "name": "Perplexity Deep Research", + "display_name": "Perplexity Deep Research", "modalities": { "input": [ "text" @@ -26995,8 +27754,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 60000, + "output": 128000 }, "tool_call": false, "reasoning": { @@ -27004,72 +27763,69 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "release_date": "2025-02-25", + "last_updated": "2025-02-25", "type": "chat" }, { - "id": "gemma-4-31B-Fabled", - "name": "Gemma 4 31B Fabled", - "display_name": "Gemma 4 31B Fabled", + "id": "qwen3.5-omni-plus", + "name": "Qwen3.5 Omni Plus", + "display_name": "Qwen3.5 Omni Plus", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 983616, + "output": 65536 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "release_date": "2026-03-30", + "last_updated": "2026-03-30", "type": "chat" }, { - "id": "Gemma-4-31B-Musica-v1", - "name": "Gemma 4 31B Musica v1", - "display_name": "Gemma 4 31B Musica v1", + "id": "doubao-seed-2-0-mini-260215", + "name": "Doubao Seed 2.0 Mini", + "display_name": "Doubao Seed 2.0 Mini", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 256000, + "output": 32000 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "v0-1.0-md", - "name": "v0 1.0 MD", - "display_name": "v0 1.0 MD", + "id": "MiniMax-M1", + "name": "MiniMax M1", + "display_name": "MiniMax M1", "modalities": { "input": [ "text" @@ -27079,23 +27835,23 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-04", - "last_updated": "2025-07-04", + "open_weights": true, + "release_date": "2025-01-08", + "last_updated": "2025-06-16", "type": "chat" }, { - "id": "Qwen3.5-27B-Derestricted", - "name": "Qwen3.5 27B Derestricted", - "display_name": "Qwen3.5 27B Derestricted", + "id": "qwen3.5-flash:thinking", + "name": "Qwen3.5 Flash Thinking", + "display_name": "Qwen3.5 Flash Thinking", "modalities": { "input": [ "text", @@ -27107,8 +27863,8 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 991808, + "output": 65536 }, "tool_call": false, "reasoning": { @@ -27128,14 +27884,41 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "venice-uncensored", - "name": "Venice Uncensored", - "display_name": "Venice Uncensored", + "id": "doubao-1.5-vision-pro-32k", + "name": "Doubao 1.5 Vision Pro 32k", + "display_name": "Doubao 1.5 Vision Pro 32k", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-11-20", + "last_updated": "2025-01-22", + "type": "chat" + }, + { + "id": "sonar", + "name": "Perplexity Simple", + "display_name": "Perplexity Simple", "modalities": { "input": [ "text" @@ -27145,23 +27928,25 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 127000, + "output": 128000 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-02-24", - "last_updated": "2025-02-24", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "jamba-mini-1.7", - "name": "Jamba Mini 1.7", - "display_name": "Jamba Mini 1.7", + "id": "glm-zero-preview", + "name": "GLM Zero Preview", + "display_name": "GLM Zero Preview", "modalities": { "input": [ "text" @@ -27171,7 +27956,7 @@ ] }, "limit": { - "context": 256000, + "context": 8000, "output": 4096 }, "tool_call": false, @@ -27180,104 +27965,93 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "release_date": "2024-12-20", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "claude-sonnet-4-thinking", - "name": "Claude 4 Sonnet Thinking", - "display_name": "Claude 4 Sonnet Thinking", + "id": "qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B", + "display_name": "Qwen3.5 35B A3B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 260096, + "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-02-24", - "last_updated": "2025-02-24", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "step-3", - "name": "Step-3", - "display_name": "Step-3", + "id": "sonar-pro", + "name": "Perplexity Pro", + "display_name": "Perplexity Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 200000, + "output": 128000 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "qwen-3.6-plus", - "name": "Qwen 3.6 Plus", - "display_name": "Qwen 3.6 Plus", + "id": "glm-4-long", + "name": "GLM-4 Long", + "display_name": "GLM-4 Long", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 991800, - "output": 65536 + "context": 1000000, + "output": 4096 }, "tool_call": false, "reasoning": { @@ -27285,108 +28059,118 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2024-01-01", + "last_updated": "2024-08-01", "type": "chat" }, { - "id": "qwen3-max-2026-01-23", - "name": "Qwen3 Max 2026-01-23", - "display_name": "Qwen3 Max 2026-01-23", + "id": "gemini-2.5-flash-nothinking", + "name": "Gemini 2.5 Flash (No Thinking)", + "display_name": "Gemini 2.5 Flash (No Thinking)", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1048756, + "output": 65536 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-26", - "last_updated": "2026-01-26", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "hermes-low", - "name": "Hermes Low", - "display_name": "Hermes Low", + "id": "doubao-seed-2-0-pro-260215", + "name": "Doubao Seed 2.0 Pro", + "display_name": "Doubao Seed 2.0 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 128000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "claude-3-5-haiku-20241022", - "name": "Claude 3.5 Haiku", - "display_name": "Claude 3.5 Haiku", + "id": "gemini-2.0-pro-exp-02-05", + "name": "Gemini 2.0 Pro 0205", + "display_name": "Gemini 2.0 Pro 0205", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 2097152, "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "release_date": "2025-02-05", + "last_updated": "2025-02-05", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "ernie-5.1", + "name": "ERNIE 5.1", + "display_name": "ERNIE 5.1", "modalities": { "input": [ "text" @@ -27396,10 +28180,44 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 119000, + "output": 64000 }, "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-10", + "last_updated": "2026-05-10", + "type": "chat" + }, + { + "id": "claude-opus-4-5-20251101:thinking", + "name": "Claude 4.5 Opus Thinking", + "display_name": "Claude 4.5 Opus Thinking", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -27407,142 +28225,182 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2025-05", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "doubao-1-5-thinking-vision-pro-250428", - "name": "Doubao 1.5 Thinking Vision Pro", - "display_name": "Doubao 1.5 Thinking Vision Pro", + "id": "gemma-4-e2b-it", + "name": "Gemma 4 E2B Instruct", + "display_name": "Gemma 4 E2B Instruct", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 131072, "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, + { + "id": "exa-answer", + "name": "Exa (Answer)", + "display_name": "Exa (Answer)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "release_date": "2025-05-15", - "last_updated": "2025-05-15", + "release_date": "2025-12-23", + "last_updated": "2025-06-04", "type": "chat" }, { - "id": "gemini-2.5-pro-preview-06-05", - "name": "Gemini 2.5 Pro Preview 0605", - "display_name": "Gemini 2.5 Pro Preview 0605", + "id": "doubao-seed-2-0-lite-260215", + "name": "Doubao Seed 2.0 Lite", + "display_name": "Doubao Seed 2.0 Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 256000, + "output": 32000 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "Qwen3.5-27B-Writer-Derestricted-Lite", - "name": "Qwen3.5 27B Writer Derestricted Lite", - "display_name": "Qwen3.5 27B Writer Derestricted Lite", + "id": "gemini-2.5-flash-lite-preview-09-2025-thinking", + "name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", + "display_name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", "modalities": { "input": [ "text", "image", - "video" + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048756, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "gemini-2.5-flash-preview-09-2025-thinking", + "name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", + "display_name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -27550,49 +28408,48 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048756, + "output": 65536 }, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, "unit": "tokens" }, - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "kimi-thinking-preview", - "name": "Kimi Thinking Preview", - "display_name": "Kimi Thinking Preview", + "id": "azure-gpt-4o", + "name": "Azure gpt-4o", + "display_name": "Azure gpt-4o", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" @@ -27602,20 +28459,20 @@ "context": 128000, "output": 16384 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "release_date": "2024-01-01", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "glm-4", - "name": "GLM-4", - "display_name": "GLM-4", + "id": "ernie-5.1:thinking", + "name": "ERNIE 5.1 Thinking", + "display_name": "ERNIE 5.1 Thinking", "modalities": { "input": [ "text" @@ -27625,27 +28482,28 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 119000, + "output": 64000 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-01-16", - "last_updated": "2024-01-16", + "release_date": "2026-05-10", + "last_updated": "2026-05-10", "type": "chat" }, { - "id": "deepseek-chat", - "name": "DeepSeek V3/Deepseek Chat", - "display_name": "DeepSeek V3/Deepseek Chat", + "id": "gemini-2.0-pro-reasoner", + "name": "Gemini 2.0 Pro Reasoner", + "display_name": "Gemini 2.0 Pro Reasoner", "modalities": { "input": [ "text", - "pdf" + "audio" ], "output": [ "text" @@ -27653,49 +28511,61 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "release_date": "2024-01-01", + "last_updated": "2025-02-05", "type": "chat" }, { - "id": "ernie-4.5-turbo-vl-32k", - "name": "Ernie 4.5 Turbo VL 32k", - "display_name": "Ernie 4.5 Turbo VL 32k", + "id": "qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 991808, + "output": 65536 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-08", - "last_updated": "2025-05-08", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-05-20", - "name": "Gemini 2.5 Flash 0520", - "display_name": "Gemini 2.5 Flash 0520", + "id": "Qwen3.5-27B-BlueStar-v2-Derestricted", + "name": "Qwen3.5 27B BlueStar v2 Derestricted", + "display_name": "Qwen3.5 27B BlueStar v2 Derestricted", "modalities": { "input": [ "text", @@ -27706,8 +28576,8 @@ ] }, "limit": { - "context": 1048000, - "output": 65536 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { @@ -27717,48 +28587,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", + "name": "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", + "display_name": "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 8192 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -27771,42 +28634,43 @@ ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "owl", - "name": "OWL", - "display_name": "OWL", + "id": "deepclaude", + "name": "DeepClaude", + "display_name": "DeepClaude", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 262144 + "context": 128000, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "release_date": "2025-03-10", + "last_updated": "2025-02-01", "type": "chat" }, { - "id": "doubao-seed-1-8-251215", - "name": "Doubao Seed 1.8", - "display_name": "Doubao Seed 1.8", + "id": "glm-4-plus-0111", + "name": "GLM 4 Plus 0111", + "display_name": "GLM 4 Plus 0111", "modalities": { "input": [ "text" @@ -27817,7 +28681,7 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 4096 }, "tool_call": false, "reasoning": { @@ -27825,130 +28689,69 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "Gemini 2.5 Flash Lite Preview (09/2025)", - "display_name": "Gemini 2.5 Flash Lite Preview (09/2025)", + "id": "Qwen3.5-27B-NaNovel-Derestricted-Lite", + "name": "Qwen3.5 27B NaNovel Derestricted Lite", + "display_name": "Qwen3.5 27B NaNovel Derestricted Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 262144, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "glm-4.1v-thinking-flashx", - "name": "GLM 4.1V Thinking FlashX", - "display_name": "GLM 4.1V Thinking FlashX", + "id": "gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview (09/2025)", + "display_name": "Gemini 2.5 Flash Preview (09/2025)", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", - "type": "chat" - }, - { - "id": "glm-z1-air", - "name": "GLM Z1 Air", - "display_name": "GLM Z1 Air", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 16384 + "context": 1048756, + "output": 65536 }, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "chat" - }, - { - "id": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", - "name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", - "display_name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 - }, - "tool_call": false, "reasoning": { "supported": true, "default": true @@ -27956,79 +28759,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-06", - "last_updated": "2026-04-06", - "type": "chat" - }, - { - "id": "Gemma-4-31B-Gemopus", - "name": "Gemma 4 31B Gemopus", - "display_name": "Gemma 4 31B Gemopus", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", - "type": "chat" - }, - { - "id": "Baichuan-M2", - "name": "Baichuan M2 32B Medical", - "display_name": "Baichuan M2 32B Medical", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-08-19", - "last_updated": "2025-08-19", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "mirothinker-1-7-deepresearch", - "name": "MiroThinker 1.7 Deep Research", - "display_name": "MiroThinker 1.7 Deep Research", + "id": "GLM-4.6-Derestricted-v5", + "name": "GLM 4.6 Derestricted v5", + "display_name": "GLM 4.6 Derestricted v5", "modalities": { "input": [ "text" @@ -28038,8 +28795,8 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 8192 }, "tool_call": false, "reasoning": { @@ -28047,15 +28804,15 @@ "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "claude-opus-4-thinking:32000", - "name": "Claude 4 Opus Thinking (32K)", - "display_name": "Claude 4 Opus Thinking (32K)", + "id": "claude-opus-4-thinking:1024", + "name": "Claude 4 Opus Thinking (1K)", + "display_name": "Claude 4 Opus Thinking (1K)", "modalities": { "input": [ "text", @@ -28070,6 +28827,7 @@ "context": 200000, "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28098,14 +28856,15 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-03-31", "release_date": "2025-05-22", "last_updated": "2025-05-22", "type": "chat" }, { - "id": "ernie-4.5-8k-preview", - "name": "Ernie 4.5 8k Preview", - "display_name": "Ernie 4.5 8k Preview", + "id": "auto-model-standard", + "name": "Auto model (Standard)", + "display_name": "Auto model (Standard)", "modalities": { "input": [ "text" @@ -28115,8 +28874,8 @@ ] }, "limit": { - "context": 8000, - "output": 16384 + "context": 1000000, + "output": 1000000 }, "tool_call": false, "reasoning": { @@ -28124,29 +28883,29 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "claude-opus-4-1-thinking:32768", - "name": "Claude 4.1 Opus Thinking (32K)", - "display_name": "Claude 4.1 Opus Thinking (32K)", + "id": "gemini-2.5-pro-exp-03-25", + "name": "Gemini 2.5 Pro Experimental 0325", + "display_name": "Gemini 2.5 Pro Experimental 0325", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048756, + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -28157,58 +28916,59 @@ "default_enabled": true, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, "unit": "tokens" }, - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "hermes-medium", - "name": "Hermes Medium", - "display_name": "Hermes Medium", + "id": "qwen3.5-27b:thinking", + "name": "Qwen3.5 27B Thinking", + "display_name": "Qwen3.5 27B Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 260096, + "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "glm-4-plus", + "name": "GLM-4 Plus", + "display_name": "GLM-4 Plus", "modalities": { "input": [ "text" @@ -28218,8 +28978,8 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 128000, + "output": 4096 }, "tool_call": false, "reasoning": { @@ -28227,14 +28987,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-02-20", - "last_updated": "2025-02-20", + "release_date": "2024-09-20", + "last_updated": "2024-08-01", "type": "chat" }, { - "id": "doubao-seed-1-6-flash-250615", - "name": "Doubao Seed 1.6 Flash", - "display_name": "Doubao Seed 1.6 Flash", + "id": "auto-model-premium", + "name": "Auto model (Premium)", + "display_name": "Auto model (Premium)", "modalities": { "input": [ "text" @@ -28244,8 +29004,8 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1000000, + "output": 1000000 }, "tool_call": false, "reasoning": { @@ -28253,41 +29013,40 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-06-15", - "last_updated": "2025-06-15", + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "mistral-small-31-24b-instruct", - "name": "Mistral Small 31 24b Instruct", - "display_name": "Mistral Small 31 24b Instruct", + "id": "brave-research", + "name": "Brave (Research)", + "display_name": "Brave (Research)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 16384, + "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "release_date": "2026-02-10", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "brave", - "name": "Brave (Answers)", - "display_name": "Brave (Answers)", + "id": "longcat-2.0:thinking", + "name": "LongCat 2.0 Thinking", + "display_name": "LongCat 2.0 Thinking", "modalities": { "input": [ "text" @@ -28297,70 +29056,60 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048756, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2023-03-02", - "last_updated": "2024-01-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 991000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "gemini-2.0-flash-thinking-exp-01-21", - "name": "Gemini 2.0 Flash Thinking 0121", - "display_name": "Gemini 2.0 Flash Thinking 0121", + "id": "Qwen3.5-27B-Writer-Derestricted", + "name": "Qwen3.5 27B Writer Derestricted", + "display_name": "Qwen3.5 27B Writer Derestricted", "modalities": { "input": [ "text", @@ -28370,61 +29119,6 @@ "text" ] }, - "limit": { - "context": 1000000, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-01-21", - "last_updated": "2025-01-21", - "type": "chat" - }, - { - "id": "auto-model-basic", - "name": "Auto model (Basic)", - "display_name": "Auto model (Basic)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 1000000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", - "type": "chat" - }, - { - "id": "Qwen3.5-27B-Anko", - "name": "Qwen3.5 27B Anko", - "display_name": "Qwen3.5 27B Anko", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, "limit": { "context": 262144, "output": 16384 @@ -28446,15 +29140,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "jamba-large-1.6", - "name": "Jamba Large 1.6", - "display_name": "Jamba Large 1.6", + "id": "azure-o3-mini", + "name": "Azure o3-mini", + "display_name": "Azure o3-mini", "modalities": { "input": [ "text" @@ -28464,8 +29158,8 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 200000, + "output": 65536 }, "tool_call": false, "reasoning": { @@ -28473,14 +29167,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2024-01-01", + "last_updated": "2025-01-31", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", - "display_name": "Gemini 2.5 Flash Lite", + "id": "qwen3-vl-235b-a22b-instruct-original", + "name": "Qwen3 VL 235B A22B Instruct Original", + "display_name": "Qwen3 VL 235B A22B Instruct Original", "modalities": { "input": [ "text", @@ -28491,43 +29185,23 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 32768, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "claude-sonnet-4-20250514", - "name": "Claude 4 Sonnet", - "display_name": "Claude 4 Sonnet", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -28539,9 +29213,10 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28570,40 +29245,54 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-07-31", "release_date": "2025-09-29", "last_updated": "2025-09-29", "type": "chat" }, { - "id": "phi-4-multimodal-instruct", - "name": "Phi 4 Multimodal", - "display_name": "Phi 4 Multimodal", + "id": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", + "name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted", + "display_name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 262144, "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "exa-research", - "name": "Exa (Research)", - "display_name": "Exa (Research)", + "id": "deepseek-v3-0324", + "name": "DeepSeek Chat 0324", + "display_name": "DeepSeek Chat 0324", "modalities": { "input": [ "text" @@ -28613,73 +29302,50 @@ ] }, "limit": { - "context": 8192, + "context": 128000, "output": 8192 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-06-04", - "last_updated": "2025-06-04", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "claude-opus-4-1-thinking:32000", - "name": "Claude 4.1 Opus Thinking (32K)", - "display_name": "Claude 4.1 Opus Thinking (32K)", + "id": "mirothinker-1-7-deepresearch-mini", + "name": "MiroThinker 1.7 Deep Research Mini", + "display_name": "MiroThinker 1.7 Deep Research Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "glm-4.1v-thinking-flash", - "name": "GLM 4.1V Thinking Flash", - "display_name": "GLM 4.1V Thinking Flash", + "id": "Qwen3.5-27B-Vivid-Durian", + "name": "Qwen3.5 27B Vivid Durian", + "display_name": "Qwen3.5 27B Vivid Durian", "modalities": { "input": [ "text", @@ -28690,23 +29356,35 @@ ] }, "limit": { - "context": 64000, - "output": 8192 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "claude-opus-4-1-thinking", - "name": "Claude 4.1 Opus Thinking", - "display_name": "Claude 4.1 Opus Thinking", + "id": "claude-opus-4-5-20251101", + "name": "Claude 4.5 Opus", + "display_name": "Claude 4.5 Opus", "modalities": { "input": [ "text", @@ -28721,20 +29399,27 @@ "context": 200000, "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", + "default_enabled": false, + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -28742,21 +29427,22 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-05", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "jamba-mini-1.6", - "name": "Jamba Mini 1.6", - "display_name": "Jamba Mini 1.6", + "id": "command-a-reasoning-08-2025", + "name": "Cohere Command A (08/2025)", + "display_name": "Cohere Command A (08/2025)", "modalities": { "input": [ "text" @@ -28767,91 +29453,77 @@ }, "limit": { "context": 256000, - "output": 4096 + "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "Qwen3.5-27B-Queen-Derestricted-Lite", - "name": "Qwen3.5 27B Queen Derestricted Lite", - "display_name": "Qwen3.5 27B Queen Derestricted Lite", + "id": "jamba-mini", + "name": "Jamba Mini", + "display_name": "Jamba Mini", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 256000, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "qwen3.7-plus:thinking", - "name": "Qwen3.7 Plus Thinking", - "display_name": "Qwen3.7 Plus Thinking", + "id": "asi1-mini", + "name": "ASI1 Mini", + "display_name": "ASI1 Mini", "modalities": { "input": [ "text", - "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 128000, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "gemini-2.0-flash-exp-image-generation", - "name": "Gemini Text + Image", - "display_name": "Gemini Text + Image", + "id": "perplexity-academic-researcher", + "name": "Perplexity Academic Researcher", + "display_name": "Perplexity Academic Researcher", "modalities": { "input": [ "text" @@ -28861,23 +29533,24 @@ ] }, "limit": { - "context": 32767, - "output": 8192 + "context": 127000, + "output": 128000 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "release_date": "2026-07-10", + "last_updated": "2026-07-10", "type": "chat" }, { - "id": "glm-4-airx", - "name": "GLM-4 AirX", - "display_name": "GLM-4 AirX", + "id": "glm-4-flash", + "name": "GLM-4 Flash", + "display_name": "GLM-4 Flash", "modalities": { "input": [ "text" @@ -28887,7 +29560,7 @@ ] }, "limit": { - "context": 8000, + "context": 128000, "output": 4096 }, "tool_call": false, @@ -28896,14 +29569,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-06-05", - "last_updated": "2024-06-05", + "release_date": "2024-01-01", + "last_updated": "2024-08-01", "type": "chat" }, { - "id": "yi-lightning", - "name": "Yi Lightning", - "display_name": "Yi Lightning", + "id": "glm-4-air", + "name": "GLM-4 Air", + "display_name": "GLM-4 Air", "modalities": { "input": [ "text" @@ -28913,7 +29586,7 @@ ] }, "limit": { - "context": 12000, + "context": 128000, "output": 4096 }, "tool_call": false, @@ -28922,28 +29595,30 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-10-16", - "last_updated": "2024-10-16", + "release_date": "2024-01-01", + "last_updated": "2024-06-05", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "claude-opus-4-thinking:8192", + "name": "Claude 4 Opus Thinking (8K)", + "display_name": "Claude 4 Opus Thinking (8K)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 200000, + "output": 32000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -28951,29 +29626,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "Gemma-4-31B-Queen", - "name": "Gemma 4 31B Queen", - "display_name": "Gemma 4 31B Queen", + "id": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", + "name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", + "display_name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -28989,70 +29674,58 @@ "default": true }, "attachment": true, - "open_weights": false, + "open_weights": true, "release_date": "2026-05-01", "last_updated": "2026-05-01", "type": "chat" }, { - "id": "qwen3.5-35b-a3b:thinking", - "name": "Qwen3.5 35B A3B Thinking", - "display_name": "Qwen3.5 35B A3B Thinking", + "id": "celeris-1", + "name": "Celeris 1", + "display_name": "Celeris 1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 8192, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2026-07-25", + "last_updated": "2026-07-25", "type": "chat" }, { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", + "name": "Qwen3.5 27B BlueStar v2 Derestricted Lite", + "display_name": "Qwen3.5 27B BlueStar v2 Derestricted Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 245800, - "output": 65536 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -29065,16 +29738,16 @@ ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-04-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "yi-large", - "name": "Yi Large", - "display_name": "Yi Large", + "id": "mistral-code-agent-latest", + "name": "Mistral Code Agent Latest", + "display_name": "Mistral Code Agent Latest", "modalities": { "input": [ "text" @@ -29084,55 +29757,79 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 262144, + "output": 32768 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "open_weights": true, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "sarvam-30b", - "name": "Sarvam 30B", - "display_name": "Sarvam 30B", + "id": "claude-opus-4-thinking:32768", + "name": "Claude 4 Opus Thinking (32K)", + "display_name": "Claude 4 Opus Thinking (32K)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", - "name": "Qwen3.5 27B Marvin V2 Derestricted Lite", - "display_name": "Qwen3.5 27B Marvin V2 Derestricted Lite", + "id": "Qwen3.5-27B-Queen-Derestricted", + "name": "Qwen3.5 27B Queen Derestricted", + "display_name": "Qwen3.5 27B Queen Derestricted", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -29159,15 +29856,15 @@ } }, "attachment": true, - "open_weights": false, + "open_weights": true, "release_date": "2026-04-30", "last_updated": "2026-04-30", "type": "chat" }, { - "id": "mistral-code-latest", - "name": "Mistral Code Latest", - "display_name": "Mistral Code Latest", + "id": "Baichuan4-Air", + "name": "Baichuan 4 Air", + "display_name": "Baichuan 4 Air", "modalities": { "input": [ "text" @@ -29177,90 +29874,39 @@ ] }, "limit": { - "context": 256000, + "context": 32768, "output": 32768 }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", - "type": "chat" - }, - { - "id": "mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 50000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", - "type": "chat" - }, - { - "id": "v0-1.5-lg", - "name": "v0 1.5 LG", - "display_name": "v0 1.5 LG", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-07-04", - "last_updated": "2025-07-04", + "release_date": "2025-08-19", + "last_updated": "2025-08-19", "type": "chat" }, { - "id": "gemini-2.5-pro-preview-03-25", - "name": "Gemini 2.5 Pro Preview 0325", - "display_name": "Gemini 2.5 Pro Preview 0325", + "id": "claude-sonnet-4-thinking:64000", + "name": "Claude 4 Sonnet Thinking (64K)", + "display_name": "Claude 4 Sonnet Thinking (64K)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 1000000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -29271,33 +29917,37 @@ "default_enabled": true, "mode": "budget", "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, + "min": 1024, "unit": "tokens" }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "claude-opus-4-20250514", - "name": "Claude 4 Opus", - "display_name": "Claude 4 Opus", + "id": "claw-low", + "name": "Claw Low", + "display_name": "Claw Low", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -29305,71 +29955,51 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-05-14", - "last_updated": "2025-05-14", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "brave-pro", - "name": "Brave (Pro)", - "display_name": "Brave (Pro)", + "id": "qwen-long", + "name": "Qwen Long 10M", + "display_name": "Qwen Long 10M", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, + "context": 10000000, "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2023-03-02", - "last_updated": "2024-01-01", + "release_date": "2024-08-01", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "auto-model", + "name": "Auto model", + "display_name": "Auto model", "modalities": { "input": [ "text" @@ -29379,87 +30009,193 @@ ] }, "limit": { - "context": 64000, - "output": 65536 + "context": 1000000, + "output": 1000000 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "claw-medium", - "name": "Claw Medium", - "display_name": "Claw Medium", + "id": "Qwen3.5-27B-NaNovel-Derestricted", + "name": "Qwen3.5 27B NaNovel Derestricted", + "display_name": "Qwen3.5 27B NaNovel Derestricted", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", + "type": "chat" + }, + { + "id": "azure-gpt-4o-mini", + "name": "Azure gpt-4o-mini", + "display_name": "Azure gpt-4o-mini", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16384 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2024-07-18", + "type": "chat" + }, + { + "id": "claude-haiku-4-5-20251001-thinking", + "name": "Claude Haiku 4.5 Thinking", + "display_name": "Claude Haiku 4.5 Thinking", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "step-2-mini", - "name": "Step-2 Mini", - "display_name": "Step-2 Mini", + "id": "claude-sonnet-4-5-20250929-thinking", + "name": "Claude Sonnet 4.5 Thinking", + "display_name": "Claude Sonnet 4.5 Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 4096 + "context": 1000000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-07-05", - "last_updated": "2024-07-05", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "yi-medium-200k", - "name": "Yi Medium 200k", - "display_name": "Yi Medium 200k", + "id": "qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -29469,36 +30205,50 @@ ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 995904, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2024-03-01", - "last_updated": "2024-03-01", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "Qwen3.5-27B-BlueStar-v3-Derestricted", - "name": "Qwen3.5 27B BlueStar v3 Derestricted", - "display_name": "Qwen3.5 27B BlueStar v3 Derestricted", + "id": "gemini-2.5-pro-preview-05-06", + "name": "Gemini 2.5 Pro Preview 0506", + "display_name": "Gemini 2.5 Pro Preview 0506", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048756, + "output": 65536 }, "tool_call": false, "reasoning": { @@ -29508,24 +30258,84 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-06", + "last_updated": "2025-05-06", + "type": "chat" + }, + { + "id": "claude-opus-4-1-thinking:8192", + "name": "Claude 4.1 Opus Thinking (8K)", + "display_name": "Claude 4.1 Opus Thinking (8K)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "ernie-4.5-turbo-128k", - "name": "Ernie 4.5 Turbo 128k", - "display_name": "Ernie 4.5 Turbo 128k", + "id": "Gemma-4-31B-Musica-v1", + "name": "Gemma 4 31B Musica v1", + "display_name": "Gemma 4 31B Musica v1", "modalities": { "input": [ "text", @@ -29536,23 +30346,24 @@ ] }, "limit": { - "context": 128000, + "context": 262144, "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-08", - "last_updated": "2025-05-08", + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "qwen25-vl-72b-instruct", - "name": "Qwen25 VL 72b", - "display_name": "Qwen25 VL 72b", + "id": "Qwen3.5-27B-Derestricted", + "name": "Qwen3.5 27B Derestricted", + "display_name": "Qwen3.5 27B Derestricted", "modalities": { "input": [ "text", @@ -29563,23 +30374,35 @@ ] }, "limit": { - "context": 32000, - "output": 32768 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-10", - "last_updated": "2025-05-10", + "open_weights": true, + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "Meta-Llama-3-1-8B-Instruct-FP8", - "name": "Llama 3.1 8B (decentralized)", - "display_name": "Llama 3.1 8B (decentralized)", + "id": "venice-uncensored", + "name": "Venice Uncensored", + "display_name": "Venice Uncensored", "modalities": { "input": [ "text" @@ -29597,15 +30420,15 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": true, + "release_date": "2025-10-01", + "last_updated": "2025-02-24", "type": "chat" }, { - "id": "venice-uncensored:web", - "name": "Venice Uncensored Web", - "display_name": "Venice Uncensored Web", + "id": "jamba-mini-1.7", + "name": "Jamba Mini 1.7", + "display_name": "Jamba Mini 1.7", "modalities": { "input": [ "text" @@ -29615,8 +30438,8 @@ ] }, "limit": { - "context": 80000, - "output": 16384 + "context": 256000, + "output": 4096 }, "tool_call": false, "reasoning": { @@ -29624,14 +30447,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-05-01", - "last_updated": "2024-05-01", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "Claude 4.1 Opus", - "display_name": "Claude 4.1 Opus", + "id": "claude-sonnet-4-thinking", + "name": "Claude 4 Sonnet Thinking", + "display_name": "Claude 4 Sonnet Thinking", "modalities": { "input": [ "text", @@ -29643,18 +30466,19 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { "min": 1024, @@ -29674,79 +30498,70 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B", - "display_name": "Qwen3.5 122B A10B", + "id": "step-3", + "name": "Step-3", + "display_name": "Step-3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 65536, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "doubao-seed-2-0-code-preview-260215", - "name": "Doubao Seed 2.0 Code Preview", - "display_name": "Doubao Seed 2.0 Code Preview", + "id": "qwen-3.6-plus", + "name": "Qwen 3.6 Plus", + "display_name": "Qwen 3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 991808, + "output": 65536 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "v0-1.5-md", - "name": "v0 1.5 MD", - "display_name": "v0 1.5 MD", + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max 2026-01-23", + "display_name": "Qwen3 Max 2026-01-23", "modalities": { "input": [ "text" @@ -29756,49 +30571,64 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 256000, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-07-04", - "last_updated": "2025-07-04", + "release_date": "2026-01-26", + "last_updated": "2026-01-26", "type": "chat" }, { - "id": "doubao-1.5-pro-256k", - "name": "Doubao 1.5 Pro 256k", - "display_name": "Doubao 1.5 Pro 256k", + "id": "hermes-low", + "name": "Hermes Low", + "display_name": "Hermes Low", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "azure-gpt-4-turbo", - "name": "Azure gpt-4-turbo", - "display_name": "Azure gpt-4-turbo", + "id": "deepseek-r1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ "text" @@ -29809,26 +30639,41 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2024-01-01", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-04-17:thinking", - "name": "Gemini 2.5 Flash Preview Thinking", - "display_name": "Gemini 2.5 Flash Preview Thinking", + "id": "gemini-2.5-pro-preview-06-05", + "name": "Gemini 2.5 Pro Preview 0605", + "display_name": "Gemini 2.5 Pro Preview 0605", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" @@ -29850,10 +30695,9 @@ "mode": "budget", "budget": { "default": -1, - "min": 0, - "max": 24576, + "min": 128, + "max": 32768, "auto": -1, - "off": 0, "unit": "tokens" }, "summaries": true, @@ -29865,155 +30709,208 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-04-17", - "last_updated": "2025-04-17", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "ernie-x1.1-preview", - "name": "ERNIE X1.1", - "display_name": "ERNIE X1.1", + "id": "Qwen3.5-27B-Writer-Derestricted-Lite", + "name": "Qwen3.5 27B Writer Derestricted Lite", + "display_name": "Qwen3.5 27B Writer Derestricted Lite", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 8192 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-09-10", - "last_updated": "2025-09-10", + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "sonar-reasoning-pro", - "name": "Perplexity Reasoning Pro", - "display_name": "Perplexity Reasoning Pro", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 127000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gemma-4-31B-Garnet", - "name": "Gemma 4 31B Garnet", - "display_name": "Gemma 4 31B Garnet", + "id": "glm-4", + "name": "GLM-4", + "display_name": "GLM-4", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 128000, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "release_date": "2024-01-01", + "last_updated": "2024-01-16", "type": "chat" }, { - "id": "sarvam-105b", - "name": "Sarvam 105B", - "display_name": "Sarvam 105B", + "id": "deepseek-chat", + "name": "DeepSeek V3/Deepseek Chat", + "display_name": "DeepSeek V3/Deepseek Chat", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 128000, + "output": 8192 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "attachment": true, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "glm-z1-airx", - "name": "GLM Z1 AirX", - "display_name": "GLM Z1 AirX", + "id": "gemini-2.5-flash-preview-05-20", + "name": "Gemini 2.5 Flash 0520", + "display_name": "Gemini 2.5 Flash 0520", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 1048000, + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "TEE/gemma4-31b", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ "text" @@ -30023,23 +30920,36 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2026-04-04", - "last_updated": "2026-04-04", + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "TEE/deepseek-v3.1", - "name": "DeepSeek V3.1 TEE", - "display_name": "DeepSeek V3.1 TEE", + "id": "doubao-seed-1-8-251215", + "name": "Doubao Seed 1.8", + "display_name": "Doubao Seed 1.8", "modalities": { "input": [ "text" @@ -30049,7 +30959,7 @@ ] }, "limit": { - "context": 164000, + "context": 128000, "output": 8192 }, "tool_call": false, @@ -30058,82 +30968,90 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2024-01-01", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "TEE/glm-5", - "name": "GLM 5 TEE", - "display_name": "GLM 5 TEE", + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "Gemini 2.5 Flash Lite Preview (09/2025)", + "display_name": "Gemini 2.5 Flash Lite Preview (09/2025)", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 65535 + "context": 1048756, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "TEE/glm-5.1", - "name": "GLM 5.1 TEE", - "display_name": "GLM 5.1 TEE", + "id": "glm-4.1v-thinking-flashx", + "name": "GLM 4.1V Thinking FlashX", + "display_name": "GLM 4.1V Thinking FlashX", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 65535 + "context": 64000, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "TEE/kimi-k2.5-thinking", - "name": "Kimi K2.5 Thinking TEE", - "display_name": "Kimi K2.5 Thinking TEE", + "id": "glm-z1-air", + "name": "GLM Z1 Air", + "display_name": "GLM Z1 Air", "modalities": { "input": [ "text" @@ -30143,39 +31061,40 @@ ] }, "limit": { - "context": 128000, - "output": 65535 + "context": 32000, + "output": 16384 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-01-29", - "last_updated": "2026-01-29", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "TEE/kimi-k2.5", - "name": "Kimi K2.5 TEE", - "display_name": "Kimi K2.5 TEE", + "id": "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", + "name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", + "display_name": "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65535 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -30188,86 +31107,70 @@ ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-29", - "last_updated": "2026-01-29", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-06", + "last_updated": "2026-04-06", "type": "chat" }, { - "id": "TEE/gpt-oss-20b", - "name": "GPT-OSS 20B TEE", - "display_name": "GPT-OSS 20B TEE", + "id": "Gemma-4-31B-Gemopus", + "name": "Gemma 4 31B Gemopus", + "display_name": "Gemma 4 31B Gemopus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "TEE/qwen3.5-27b", - "name": "Qwen3.5 27B TEE", - "display_name": "Qwen3.5 27B TEE", + "id": "Baichuan-M2", + "name": "Baichuan M2 32B Medical", + "display_name": "Baichuan M2 32B Medical", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 32768, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-13", - "last_updated": "2026-03-13", + "release_date": "2025-08-19", + "last_updated": "2025-08-19", "type": "chat" }, { - "id": "TEE/glm-4.7-flash", - "name": "GLM 4.7 Flash TEE", - "display_name": "GLM 4.7 Flash TEE", + "id": "mirothinker-1-7-deepresearch", + "name": "MiroThinker 1.7 Deep Research", + "display_name": "MiroThinker 1.7 Deep Research", "modalities": { "input": [ "text" @@ -30277,72 +31180,91 @@ ] }, "limit": { - "context": 203000, - "output": 65535 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "TEE/kimi-k2.6", - "name": "Kimi K2.6 TEE", - "display_name": "Kimi K2.6 TEE", + "id": "claude-opus-4-thinking:32000", + "name": "Claude 4 Opus Thinking (32K)", + "display_name": "Claude 4 Opus Thinking (32K)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "TEE/deepseek-v4-pro", - "name": "DeepSeek V4 Pro TEE", - "display_name": "DeepSeek V4 Pro TEE", + "id": "claude-opus-4-1-thinking:32768", + "name": "Claude 4.1 Opus Thinking (32K)", + "display_name": "Claude 4.1 Opus Thinking (32K)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 800000, - "output": 65536 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30351,24 +31273,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-25", - "last_updated": "2026-04-25", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "TEE/gemma-3-27b-it", - "name": "Gemma 3 27B TEE", - "display_name": "Gemma 3 27B TEE", + "id": "hermes-medium", + "name": "Hermes Medium", + "display_name": "Hermes Medium", "modalities": { "input": [ "text" @@ -30378,23 +31311,24 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 204800, + "output": 131072 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "TEE/llama3-3-70b", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ "text" @@ -30404,81 +31338,76 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 32768 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-03", - "last_updated": "2025-07-03", + "open_weights": true, + "release_date": "2025-02-20", + "last_updated": "2025-02-20", "type": "chat" }, { - "id": "TEE/gemma-4-26b-a4b-uncensored", - "name": "Gemma 4 26B A4B Uncensored TEE", - "display_name": "Gemma 4 26B A4B Uncensored TEE", + "id": "doubao-seed-1-6-flash-250615", + "name": "Doubao Seed 1.6 Flash", + "display_name": "Doubao Seed 1.6 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 256000, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-23", - "last_updated": "2026-05-23", + "release_date": "2024-01-01", + "last_updated": "2025-06-15", "type": "chat" }, { - "id": "TEE/deepseek-v3.2", - "name": "DeepSeek V3.2 TEE", - "display_name": "DeepSeek V3.2 TEE", + "id": "mistral-small-31-24b-instruct", + "name": "Mistral Small 31 24b Instruct", + "display_name": "Mistral Small 31 24b Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 65536 + "context": 128000, + "output": 131072 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "TEE/glm-4.7", - "name": "GLM 4.7 TEE", - "display_name": "GLM 4.7 TEE", + "id": "brave", + "name": "Brave (Answers)", + "display_name": "Brave (Answers)", "modalities": { "input": [ "text" @@ -30488,65 +31417,73 @@ ] }, "limit": { - "context": 131000, - "output": 65535 + "context": 8192, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-01-29", - "last_updated": "2026-01-29", + "release_date": "2026-02-13", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "TEE/gpt-oss-120b", - "name": "GPT-OSS 120B TEE", - "display_name": "GPT-OSS 120B TEE", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1048756, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "TEE/minimax-m2.5", - "name": "MiniMax M2.5 TEE", - "display_name": "MiniMax M2.5 TEE", + "id": "auto-model-basic", + "name": "Auto model (Basic)", + "display_name": "Auto model (Basic)", "modalities": { "input": [ "text" @@ -30556,32 +31493,27 @@ ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1000000, + "output": 1000000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "TEE/gemma-4-31b-it", - "name": "Gemma 4 31B IT TEE", - "display_name": "Gemma 4 31B IT TEE", + "id": "Qwen3.5-27B-Anko", + "name": "Qwen3.5 27B Anko", + "display_name": "Qwen3.5 27B Anko", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -30589,28 +31521,34 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-26", - "last_updated": "2026-05-26", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "TEE/gemma4-31b:thinking", - "name": "Gemma 4 31B Thinking TEE", - "display_name": "Gemma 4 31B Thinking TEE", + "id": "jamba-large-1.6", + "name": "Jamba Large 1.6", + "display_name": "Jamba Large 1.6", "modalities": { "input": [ "text" @@ -30620,114 +31558,154 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "TEE/deepseek-v4-pro:thinking", - "name": "DeepSeek V4 Pro Thinking TEE", - "display_name": "DeepSeek V4 Pro Thinking TEE", + "id": "gemma-4-12b-it", + "name": "Gemma 4 12B Instruct", + "display_name": "Gemma 4 12B Instruct", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 800000, - "output": 65536 + "context": 262144, + "output": 32768 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-01", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "TEE/qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507 TEE", - "display_name": "Qwen3 30B A3B Instruct 2507 TEE", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "display_name": "Gemini 2.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 1048756, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "TEE/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B TEE", - "display_name": "Qwen3.5 397B A17B TEE", + "id": "claude-sonnet-4-20250514", + "name": "Claude 4 Sonnet", + "display_name": "Claude 4 Sonnet", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 258048, - "output": 65536 + "context": 200000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-28", - "last_updated": "2026-02-28", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "TEE/glm-5.1-thinking", - "name": "GLM 5.1 Thinking TEE", - "display_name": "GLM 5.1 Thinking TEE", + "id": "phi-4-multimodal-instruct", + "name": "Phi 4 Multimodal", + "display_name": "Phi 4 Multimodal", "modalities": { "input": [ "text" @@ -30737,37 +31715,38 @@ ] }, "limit": { - "context": 202752, - "output": 65535 + "context": 128000, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "TEE/qwen3.6-35b-a3b-uncensored", - "name": "Qwen3.6 35B A3B Uncensored TEE", - "display_name": "Qwen3.6 35B A3B Uncensored TEE", + "id": "claude-opus-4-1-thinking:32000", + "name": "Claude 4.1 Opus Thinking (32K)", + "display_name": "Claude 4.1 Opus Thinking (32K)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30776,36 +31755,77 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-23", - "last_updated": "2026-05-23", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "TEE/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B TEE", - "display_name": "Qwen3.5 122B A10B TEE", + "id": "glm-4.1v-thinking-flash", + "name": "GLM 4.1V Thinking Flash", + "display_name": "GLM 4.1V Thinking Flash", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 64000, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "type": "chat" + }, + { + "id": "claude-opus-4-1-thinking", + "name": "Claude 4.1 Opus Thinking", + "display_name": "Claude 4.1 Opus Thinking", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30814,104 +31834,131 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-26", - "last_updated": "2026-05-26", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "TEE/qwen2.5-vl-72b-instruct", - "name": "Qwen2.5 VL 72B TEE", - "display_name": "Qwen2.5 VL 72B TEE", + "id": "jamba-mini-1.6", + "name": "Jamba Mini 1.6", + "display_name": "Jamba Mini 1.6", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 256000, + "output": 4096 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-02-01", - "last_updated": "2025-02-01", + "release_date": "2024-01-01", + "last_updated": "2025-03-01", "type": "chat" }, { - "id": "microsoft/wizardlm-2-8x22b", - "name": "WizardLM-2 8x22B", - "display_name": "WizardLM-2 8x22B", + "id": "Qwen3.5-27B-Queen-Derestricted-Lite", + "name": "Qwen3.5 27B Queen Derestricted Lite", + "display_name": "Qwen3.5 27B Queen Derestricted Lite", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "cohere/command-r", - "name": "Cohere: Command R", - "display_name": "Cohere: Command R", + "id": "qwen3.7-plus:thinking", + "name": "Qwen3.7 Plus Thinking", + "display_name": "Qwen3.7 Plus Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 983616, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-03-11", - "last_updated": "2024-03-11", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Cohere: Command R+", - "display_name": "Cohere: Command R+", + "id": "glm-4-airx", + "name": "GLM-4 AirX", + "display_name": "GLM-4 AirX", "modalities": { "input": [ "text" @@ -30921,23 +31968,23 @@ ] }, "limit": { - "context": 128000, + "context": 8000, "output": 4096 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "release_date": "2024-01-01", + "last_updated": "2024-06-05", "type": "chat" }, { - "id": "baseten/Kimi-K2-Instruct-FP4", - "name": "Kimi K2 0711 Instruct FP4", - "display_name": "Kimi K2 0711 Instruct FP4", + "id": "yi-lightning", + "name": "Yi Lightning", + "display_name": "Yi Lightning", "modalities": { "input": [ "text" @@ -30947,8 +31994,8 @@ ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 12000, + "output": 4096 }, "tool_call": false, "reasoning": { @@ -30956,106 +32003,122 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "release_date": "2025-06-15", + "last_updated": "2024-10-16", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "Nvidia Nemotron 3 Nano 30B", - "display_name": "Nvidia Nemotron 3 Nano 30B", + "id": "qwen3-vl-235b-a22b-thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 32768, + "output": 32768 }, - "temperature": true, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "attachment": true, + "open_weights": true, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", - "name": "Nvidia Nemotron 70b", - "display_name": "Nvidia Nemotron 70b", + "id": "Gemma-4-31B-Queen", + "name": "Gemma 4 31B Queen", + "display_name": "Gemma 4 31B Queen", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "attachment": true, + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nvidia Nemotron 3 Super 120B", - "display_name": "Nvidia Nemotron 3 Super 120B", + "id": "qwen3.5-35b-a3b:thinking", + "name": "Qwen3.5 35B A3B Thinking", + "display_name": "Qwen3.5 35B A3B Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 260096, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b:thinking", - "name": "Nvidia Nemotron 3 Super 120B Thinking", - "display_name": "Nvidia Nemotron 3 Super 120B Thinking", + "id": "qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -31065,25 +32128,36 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 245760, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", - "name": "Nvidia Nemotron Super 49B", - "display_name": "Nvidia Nemotron Super 49B", + "id": "yi-large", + "name": "Yi Large", + "display_name": "Yi Large", "modalities": { "input": [ "text" @@ -31093,36 +32167,34 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32000, + "output": 4096 }, - "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "release_date": "2024-01-01", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", - "name": "Nvidia Nemotron 3 Nano Omni", - "display_name": "Nvidia Nemotron 3 Nano Omni", + "id": "sarvam-30b", + "name": "Sarvam 30B", + "display_name": "Sarvam 30B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 65536, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -31130,21 +32202,55 @@ "supported": true, "default": true }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-18", + "last_updated": "2026-02-18", + "type": "chat" + }, + { + "id": "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", + "name": "Qwen3.5 27B Marvin V2 Derestricted Lite", + "display_name": "Qwen3.5 27B Marvin V2 Derestricted Lite", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "nvidia/nvidia-nemotron-nano-9b-v2", - "name": "Nvidia Nemotron Nano 9B v2", - "display_name": "Nvidia Nemotron Nano 9B v2", + "id": "mistral-code-latest", + "name": "Mistral Code Latest", + "display_name": "Mistral Code Latest", "modalities": { "input": [ "text" @@ -31154,24 +32260,23 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 32768 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5", - "name": "Nvidia Nemotron Super 49B v1.5", - "display_name": "Nvidia Nemotron Super 49B v1.5", + "id": "nano-gpt-help", + "name": "NanoGPT Help", + "display_name": "NanoGPT Help", "modalities": { "input": [ "text" @@ -31181,24 +32286,23 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 6000, + "output": 512 }, - "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "release_date": "2026-06-06", + "last_updated": "2026-06-06", "type": "chat" }, { - "id": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", - "name": "Qwen 2.5 32B Abliterated", - "display_name": "Qwen 2.5 32B Abliterated", + "id": "mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ "text" @@ -31208,76 +32312,124 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 128000, + "output": 50000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-01-06", - "last_updated": "2025-01-06", + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", - "name": "DeepSeek R1 Llama 70B Abliterated", - "display_name": "DeepSeek R1 Llama 70B Abliterated", + "id": "gemini-2.5-pro-preview-03-25", + "name": "Gemini 2.5 Pro Preview 0325", + "display_name": "Gemini 2.5 Pro Preview 0325", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1048756, + "output": 65536 }, "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", - "name": "Llama 3.3 70B Instruct abliterated", - "display_name": "Llama 3.3 70B Instruct abliterated", + "id": "claude-opus-4-20250514", + "name": "Claude 4 Opus", + "display_name": "Claude 4 Opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 200000, + "output": 32000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", - "name": "DeepSeek R1 Qwen Abliterated", - "display_name": "DeepSeek R1 Qwen Abliterated", + "id": "brave-pro", + "name": "Brave (Pro)", + "display_name": "Brave (Pro)", "modalities": { "input": [ "text" @@ -31287,24 +32439,23 @@ ] }, "limit": { - "context": 16384, + "context": 8192, "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2026-02-10", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "deepcogito/cogito-v1-preview-qwen-32B", - "name": "Cogito v1 Preview Qwen 32B", - "display_name": "Cogito v1 Preview Qwen 32B", + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ "text" @@ -31314,155 +32465,147 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 64000, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-10", - "last_updated": "2025-05-10", + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "longcat-2.0", + "name": "LongCat 2.0", + "display_name": "LongCat 2.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1048756, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "claw-medium", + "name": "Claw Medium", + "display_name": "Claw Medium", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "google/gemma-4-31b-it:thinking", - "name": "Gemma 4 31B Thinking", - "display_name": "Gemma 4 31B Thinking", + "id": "step-2-mini", + "name": "Step-2 Mini", + "display_name": "Step-2 Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 8000, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2024-10-15", + "last_updated": "2024-07-05", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it:thinking", - "name": "Gemma 4 26B A4B Thinking", - "display_name": "Gemma 4 26B A4B Thinking", + "id": "yi-medium-200k", + "name": "Yi Medium 200k", + "display_name": "Yi Medium 200k", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 200000, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2024-01-01", + "last_updated": "2024-03-01", "type": "chat" }, { - "id": "google/gemini-3.5-flash-thinking", - "name": "Gemini 3.5 Flash Thinking", - "display_name": "Gemini 3.5 Flash Thinking", + "id": "Qwen3.5-27B-BlueStar-v3-Derestricted", + "name": "Qwen3.5 27B BlueStar v3 Derestricted", + "display_name": "Qwen3.5 27B BlueStar v3 Derestricted", "modalities": { "input": [ "text", @@ -31473,8 +32616,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 16384 }, "tool_call": false, "reasoning": { @@ -31484,32 +32627,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "google/gemini-pro-latest", - "name": "Gemini Pro Latest", - "display_name": "Gemini Pro Latest", + "id": "qwen25-vl-72b-instruct", + "name": "Qwen25 VL 72b", + "display_name": "Qwen25 VL 72b", "modalities": { "input": [ "text", @@ -31520,198 +32655,222 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 32000, + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "open_weights": true, + "release_date": "2025-05-10", + "last_updated": "2025-05-10", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-high", - "name": "Gemini 3.1 Pro (Preview High)", - "display_name": "Gemini 3.1 Pro (Preview High)", + "id": "Meta-Llama-3-1-8B-Instruct-FP8", + "name": "Llama 3.1 8B (decentralized)", + "display_name": "Llama 3.1 8B (decentralized)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "claude-opus-4-1-20250805", + "name": "Claude 4.1 Opus", + "display_name": "Claude 4.1 Opus", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-21", - "last_updated": "2026-02-21", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash (Preview)", - "display_name": "Gemini 3 Flash (Preview)", + "id": "qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B", + "display_name": "Qwen3.5 122B A10B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 131072, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro (Preview Custom Tools)", - "display_name": "Gemini 3.1 Pro (Preview Custom Tools)", + "id": "doubao-seed-2-0-code-preview-260215", + "name": "Doubao Seed 2.0 Code Preview", + "display_name": "Doubao Seed 2.0 Code Preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 256000, + "output": 128000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-27", - "last_updated": "2026-02-27", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B", - "display_name": "Gemma 4 26B A4B", + "id": "doubao-1.5-pro-256k", + "name": "Doubao 1.5 Pro 256k", + "display_name": "Doubao 1.5 Pro 256k", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "attachment": false, + "open_weights": false, + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "azure-gpt-4-turbo", + "name": "Azure gpt-4-turbo", + "display_name": "Azure gpt-4-turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 128000, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "google/gemini-3-flash-preview-thinking", - "name": "Gemini 3 Flash Thinking", - "display_name": "Gemini 3 Flash Thinking", + "id": "gemini-2.5-flash-preview-04-17:thinking", + "name": "Gemini 2.5 Flash Preview Thinking", + "display_name": "Gemini 2.5 Flash Preview Thinking", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" @@ -31730,14 +32889,15 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ @@ -31747,65 +32907,60 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "qwen3.7-flash:thinking", + "name": "Qwen3.7 Flash Thinking", + "display_name": "Qwen3.7 Flash Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 983616, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "ernie-x1.1-preview", + "name": "ERNIE X1.1", + "display_name": "ERNIE X1.1", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 64000, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -31814,88 +32969,71 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-09-10", + "last_updated": "2025-09-10", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro (Preview)", - "display_name": "Gemini 3.1 Pro (Preview)", + "id": "sonar-reasoning-pro", + "name": "Perplexity Reasoning Pro", + "display_name": "Perplexity Reasoning Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 127000, + "output": 128000 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash Lite Latest", - "display_name": "Gemini Flash Lite Latest", + "id": "sarvam-105b", + "name": "Sarvam 105B", + "display_name": "Sarvam 105B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 4096 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-09-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "google/gemini-flash-1.5", - "name": "Gemini 1.5 Flash", - "display_name": "Gemini 1.5 Flash", + "id": "glm-z1-airx", + "name": "GLM Z1 AirX", + "display_name": "GLM Z1 AirX", "modalities": { "input": [ "text" @@ -31905,23 +33043,23 @@ ] }, "limit": { - "context": 2000000, - "output": 8192 + "context": 32000, + "output": 16384 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-05-14", - "last_updated": "2024-05-14", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-low", - "name": "Gemini 3.1 Pro (Preview Low)", - "display_name": "Gemini 3.1 Pro (Preview Low)", + "id": "TEE/gemma4-31b", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", @@ -31932,68 +33070,49 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 262144, + "output": 131072 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-21", - "last_updated": "2026-02-21", + "open_weights": true, + "release_date": "2026-04-04", + "last_updated": "2026-04-04", "type": "chat" }, { - "id": "zai-org/glm-4.6v", - "name": "GLM 4.6V", - "display_name": "GLM 4.6V", + "id": "TEE/deepseek-v3.1", + "name": "DeepSeek V3.1 TEE", + "display_name": "DeepSeek V3.1 TEE", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 24000 + "context": 164000, + "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "zai-org/glm-5", - "name": "GLM 5", - "display_name": "GLM 5", + "id": "TEE/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B TEE", + "display_name": "Qwen3.6 35B A3B TEE", "modalities": { "input": [ "text" @@ -32003,13 +33122,13 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -32024,14 +33143,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "zai-org/glm-5:thinking", - "name": "GLM 5 Thinking", - "display_name": "GLM 5 Thinking", + "id": "TEE/glm-5.1", + "name": "GLM 5.1 TEE", + "display_name": "GLM 5.1 TEE", "modalities": { "input": [ "text" @@ -32041,27 +33160,34 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 202752, + "output": 65535 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "zai-org/GLM-4.5:thinking", - "name": "GLM 4.5 (Thinking)", - "display_name": "GLM 4.5 (Thinking)", + "id": "TEE/kimi-k2.5-thinking", + "name": "Kimi K2.5 Thinking TEE", + "display_name": "Kimi K2.5 Thinking TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -32069,23 +33195,25 @@ }, "limit": { "context": 128000, - "output": 65536 + "output": 65535 }, + "temperature": false, "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "zai-org/glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "TEE/deepseek-v4-flash", + "name": "DeepSeek V4 Flash TEE", + "display_name": "DeepSeek V4 Flash TEE", "modalities": { "input": [ "text" @@ -32095,56 +33223,76 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "zai-org/glm-4.6-original", - "name": "GLM 4.6 Original", - "display_name": "GLM 4.6 Original", + "id": "TEE/kimi-k2.5", + "name": "Kimi K2.5 TEE", + "display_name": "Kimi K2.5 TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 128000, "output": 65535 }, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "zai-org/GLM-4.5-Air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "TEE/gpt-oss-20b", + "name": "GPT-OSS 20B TEE", + "display_name": "GPT-OSS 20B TEE", "modalities": { "input": [ "text" @@ -32154,55 +33302,69 @@ ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 131072, + "output": 8192 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "zai-org/glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "TEE/qwen3.5-27b", + "name": "Qwen3.5 27B TEE", + "display_name": "Qwen3.5 27B TEE", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai-org/glm-4.7-original", - "name": "GLM 4.7 Original", - "display_name": "GLM 4.7 Original", + "id": "TEE/glm-5.2", + "name": "GLM 5.2 TEE", + "display_name": "GLM 5.2 TEE", "modalities": { "input": [ "text" @@ -32212,78 +33374,104 @@ ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "zai-org/glm-5-original", - "name": "GLM 5 Original", - "display_name": "GLM 5 Original", + "id": "TEE/kimi-k2.6", + "name": "Kimi K2.6 TEE", + "display_name": "Kimi K2.6 TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "zai-org/glm-5-original:thinking", - "name": "GLM 5 Original Thinking", - "display_name": "GLM 5 Original Thinking", + "id": "TEE/qwen3.6-27b", + "name": "Qwen3.6 27B TEE", + "display_name": "Qwen3.6 27B TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "zai-org/glm-4.7-flash-original", - "name": "GLM 4.7 Flash Original", - "display_name": "GLM 4.7 Flash Original", + "id": "TEE/gemma-3-27b-it", + "name": "Gemma 3 27B TEE", + "display_name": "Gemma 3 27B TEE", "modalities": { "input": [ "text" @@ -32293,24 +33481,23 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "zai-org/GLM-4.6-turbo:thinking", - "name": "GLM 4.6 Turbo (Thinking)", - "display_name": "GLM 4.6 Turbo (Thinking)", + "id": "TEE/llama3-3-70b", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ "text" @@ -32320,51 +33507,50 @@ ] }, "limit": { - "context": 200000, - "output": 204800 + "context": 128000, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", + "open_weights": true, + "release_date": "2025-07-03", + "last_updated": "2025-07-03", "type": "chat" }, { - "id": "zai-org/glm-5.1:thinking", - "name": "GLM 5.1 Thinking", - "display_name": "GLM 5.1 Thinking", + "id": "TEE/gemma-4-26b-a4b-uncensored", + "name": "Gemma 4 26B A4B Uncensored TEE", + "display_name": "Gemma 4 26B A4B Uncensored TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 65536, + "output": 65536 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "release_date": "2026-05-23", + "last_updated": "2026-05-23", "type": "chat" }, { - "id": "zai-org/glm-4.5", - "name": "GLM 4.5", - "display_name": "GLM 4.5", + "id": "TEE/deepseek-v3.2", + "name": "DeepSeek V3.2 TEE", + "display_name": "DeepSeek V3.2 TEE", "modalities": { "input": [ "text" @@ -32374,23 +33560,28 @@ ] }, "limit": { - "context": 128000, + "context": 164000, "output": 65536 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "zai-org/glm-4.7-original:thinking", - "name": "GLM 4.7 Original Thinking", - "display_name": "GLM 4.7 Original Thinking", + "id": "TEE/glm-4.7", + "name": "GLM 4.7 TEE", + "display_name": "GLM 4.7 TEE", "modalities": { "input": [ "text" @@ -32400,24 +33591,36 @@ ] }, "limit": { - "context": 200000, + "context": 131000, "output": 65535 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, + "open_weights": true, + "knowledge": "2025-04", "release_date": "2025-12-22", "last_updated": "2025-12-22", "type": "chat" }, { - "id": "zai-org/glm-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "TEE/gpt-oss-120b", + "name": "GPT-OSS 120B TEE", + "display_name": "GPT-OSS 120B TEE", "modalities": { "input": [ "text" @@ -32427,35 +33630,29 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-01-29", - "last_updated": "2026-01-29", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "zai-org/GLM-4.6-turbo", - "name": "GLM 4.6 Turbo", - "display_name": "GLM 4.6 Turbo", + "id": "TEE/minimax-m2.5", + "name": "MiniMax M2.5 TEE", + "display_name": "MiniMax M2.5 TEE", "modalities": { "input": [ "text" @@ -32465,23 +33662,30 @@ ] }, "limit": { - "context": 200000, - "output": 204800 + "context": 196608, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "zai-org/glm-latest", - "name": "GLM Latest", - "display_name": "GLM Latest", + "id": "TEE/gemma-4-31b-it", + "name": "Gemma 4 31B IT TEE", + "display_name": "Gemma 4 31B IT TEE", "modalities": { "input": [ "text" @@ -32491,51 +33695,58 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "zai-org/GLM-4.5-Air:thinking", - "name": "GLM 4.5 Air (Thinking)", - "display_name": "GLM 4.5 Air (Thinking)", + "id": "TEE/gemma4-31b:thinking", + "name": "Gemma 4 31B Thinking TEE", + "display_name": "Gemma 4 31B Thinking TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 262144, + "output": 131072 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-05-02", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "zai-org/glm-4.6v-flash-original", - "name": "GLM 4.6V Flash", - "display_name": "GLM 4.6V Flash", + "id": "TEE/kimi-k3", + "name": "Kimi K3 TEE", + "display_name": "Kimi K3 TEE", "modalities": { "input": [ "text", @@ -32547,50 +33758,68 @@ ] }, "limit": { - "context": 128000, - "output": 24000 + "context": 1048576, + "output": 65535 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "zai-org/glm-4.6v-original", - "name": "GLM 4.6V Original", - "display_name": "GLM 4.6V Original", + "id": "TEE/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B TEE", + "display_name": "Qwen3.5 397B A17B TEE", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 24000 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "zai-org/glm-4.7-flash:thinking", - "name": "GLM 4.7 Flash Thinking", - "display_name": "GLM 4.7 Flash Thinking", + "id": "TEE/glm-5.2:thinking", + "name": "GLM 5.2 Thinking TEE", + "display_name": "GLM 5.2 Thinking TEE", "modalities": { "input": [ "text" @@ -32600,24 +33829,25 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "zai-org/glm-4.7-flash-original:thinking", - "name": "GLM 4.7 Flash Original Thinking", - "display_name": "GLM 4.7 Flash Original Thinking", + "id": "TEE/glm-5.1-thinking", + "name": "GLM 5.1 Thinking TEE", + "display_name": "GLM 5.1 Thinking TEE", "modalities": { "input": [ "text" @@ -32627,51 +33857,64 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 202752, + "output": 65535 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "zai-org/glm-4.7:thinking", - "name": "GLM 4.7 Thinking", - "display_name": "GLM 4.7 Thinking", + "id": "TEE/qwen3.6-35b-a3b-uncensored", + "name": "Qwen3.6 35B A3B Uncensored TEE", + "display_name": "Qwen3.6 35B A3B Uncensored TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 131072, + "output": 131072 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-23", + "last_updated": "2026-05-23", "type": "chat" }, { - "id": "featherless-ai/Qwerky-72B", - "name": "Qwerky 72B", - "display_name": "Qwerky 72B", + "id": "TEE/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B TEE", + "display_name": "Qwen3.5 122B A10B TEE", "modalities": { "input": [ "text" @@ -32681,34 +33924,47 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "unsloth/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "TEE/qwen2.5-vl-72b-instruct", + "name": "Qwen2.5 VL 72B TEE", + "display_name": "Qwen2.5 VL 72B TEE", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 65536, "output": 8192 }, "tool_call": false, @@ -32716,15 +33972,15 @@ "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-02-01", "type": "chat" }, { - "id": "unsloth/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "microsoft/wizardlm-2-8x22b", + "name": "WizardLM-2 8x22B", + "display_name": "WizardLM-2 8x22B", "modalities": { "input": [ "text", @@ -32735,79 +33991,85 @@ ] }, "limit": { - "context": 128000, - "output": 96000 + "context": 65536, + "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "unsloth/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "cohere/north-mini-code", + "name": "Cohere North Mini Code 1.0", + "display_name": "Cohere North Mini Code 1.0", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 256000, + "output": 64000 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09-23", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "perceptron/perceptron-mk1", - "name": "Perceptron Mk1", - "display_name": "Perceptron Mk1", + "id": "cohere/command-r-plus-08-2024", + "name": "Cohere: Command R+", + "display_name": "Cohere: Command R+", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 128000, + "output": 4096 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "Steelskull/L3.3-MS-Evalebis-70b", - "name": "MS Evalebis 70b", - "display_name": "MS Evalebis 70b", + "id": "baseten/Kimi-K2-Instruct-FP4", + "name": "Kimi K2 0711 Instruct FP4", + "display_name": "Kimi K2 0711 Instruct FP4", "modalities": { "input": [ "text" @@ -32817,23 +34079,23 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 128000, + "output": 131072 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "Steelskull/L3.3-MS-Nevoria-70b", - "name": "Steelskull Nevoria 70b", - "display_name": "Steelskull Nevoria 70b", + "id": "nvidia/nemotron-3-ultra-550b-a55b:thinking", + "name": "Nvidia Nemotron 3 Ultra 550B Thinking", + "display_name": "Nvidia Nemotron 3 Ultra 550B Thinking", "modalities": { "input": [ "text" @@ -32843,23 +34105,57 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", + "type": "chat" + }, + { + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nvidia Nemotron 3 Nano 30B", + "display_name": "Nvidia Nemotron 3 Nano 30B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 262144 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": true, + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "Steelskull/L3.3-MS-Evayale-70B", - "name": "Evayale 70b ", - "display_name": "Evayale 70b ", + "id": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", + "name": "Nvidia Nemotron 70b", + "display_name": "Nvidia Nemotron 70b", "modalities": { "input": [ "text" @@ -32870,22 +34166,23 @@ }, "limit": { "context": 16384, - "output": 16384 + "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "Steelskull/L3.3-Cu-Mai-R1-70b", - "name": "Llama 3.3 70B Cu Mai", - "display_name": "Llama 3.3 70B Cu Mai", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nvidia Nemotron 3 Super 120B", + "display_name": "Nvidia Nemotron 3 Super 120B", "modalities": { "input": [ "text" @@ -32895,23 +34192,30 @@ ] }, "limit": { - "context": 16384, + "context": 262144, "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": true, + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "Steelskull/L3.3-Electra-R1-70b", - "name": "Steelskull Electra R1 70b", - "display_name": "Steelskull Electra R1 70b", + "id": "nvidia/nemotron-3-super-120b-a12b:thinking", + "name": "Nvidia Nemotron 3 Super 120B Thinking", + "display_name": "Nvidia Nemotron 3 Super 120B Thinking", "modalities": { "input": [ "text" @@ -32921,23 +34225,25 @@ ] }, "limit": { - "context": 16384, + "context": 262144, "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": true, + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "Steelskull/L3.3-Nevoria-R1-70b", - "name": "Steelskull Nevoria R1 70b", - "display_name": "Steelskull Nevoria R1 70b", + "id": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "name": "Nvidia Nemotron Super 49B", + "display_name": "Nvidia Nemotron Super 49B", "modalities": { "input": [ "text" @@ -32947,61 +34253,58 @@ ] }, "limit": { - "context": 16384, + "context": 128000, "output": 16384 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": true, + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen 3 32b", - "display_name": "Qwen 3 32b", + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "name": "Nvidia Nemotron 3 Nano Omni", + "display_name": "Nvidia Nemotron 3 Nano Omni", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 256000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nvidia Nemotron 3 Ultra 550B", + "display_name": "Nvidia Nemotron 3 Ultra 550B", "modalities": { "input": [ "text" @@ -33011,34 +34314,30 @@ ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 1000000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen 3 235b A22B 2507", - "display_name": "Qwen 3 235b A22B 2507", + "id": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", + "name": "Qwen 2.5 32B Abliterated", + "display_name": "Qwen 2.5 32B Abliterated", "modalities": { "input": [ "text" @@ -33048,62 +34347,50 @@ ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 32768, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "open_weights": true, + "release_date": "2025-01-06", + "last_updated": "2025-01-06", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", + "name": "DeepSeek R1 Llama 70B Abliterated", + "display_name": "DeepSeek R1 Llama 70B Abliterated", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 16384, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", - "name": "Qwen 3 235b A22B 2507 (TEE)", - "display_name": "Qwen 3 235b A22B 2507 (TEE)", + "id": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", + "name": "Llama 3.3 70B Instruct abliterated", + "display_name": "Llama 3.3 70B Instruct abliterated", "modalities": { "input": [ "text" @@ -33113,23 +34400,23 @@ ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "open_weights": true, + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B (Thinking)", - "display_name": "Qwen3 Next 80B A3B (Thinking)", + "id": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", + "name": "DeepSeek R1 Qwen Abliterated", + "display_name": "DeepSeek R1 Qwen Abliterated", "modalities": { "input": [ "text" @@ -33139,177 +34426,166 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 16384, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "deepcogito/cogito-v1-preview-qwen-32B", + "name": "Cogito v1 Preview Qwen 32B", + "display_name": "Cogito v1 Preview Qwen 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 128000, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-10", - "last_updated": "2026-03-10", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-10", + "last_updated": "2025-05-10", "type": "chat" }, { - "id": "qwen/Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 1048756, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/qwen3-14b", - "name": "Qwen 3 14b", - "display_name": "Qwen 3 14b", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/Qwen3-8B", - "name": "Qwen 3 8B", - "display_name": "Qwen 3 8B", + "id": "google/gemma-4-31b-it:thinking", + "name": "Gemma 4 31B Thinking", + "display_name": "Gemma 4 31B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 262144, + "output": 131072 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen 3 235b A22B", - "display_name": "Qwen 3 235b A22B", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", + "image", + "video", + "audio", "pdf" ], "output": [ @@ -33317,85 +34593,75 @@ ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "google/gemma-4-26b-a4b-it:thinking", + "name": "Gemma 4 26B A4B Thinking", + "display_name": "Gemma 4 26B A4B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 262144, + "output": 131072 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b-thinking", - "name": "Qwen3.5 397B A17B Thinking", - "display_name": "Qwen3.5 397B A17B Thinking", + "id": "google/gemini-3.5-flash-thinking", + "name": "Gemini 3.5 Flash Thinking", + "display_name": "Gemini 3.5 Flash Thinking", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 258048, + "context": 1048576, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -33404,231 +34670,307 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "google/gemini-pro-latest", + "name": "Gemini Pro Latest", + "display_name": "Gemini Pro Latest", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1048756, "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-17", - "last_updated": "2025-09-17", + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "google/gemini-3.1-pro-preview-high", + "name": "Gemini 3.1 Pro (Preview High)", + "display_name": "Gemini 3.1 Pro (Preview High)", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1048756, "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-17", - "last_updated": "2025-09-17", + "release_date": "2026-02-21", + "last_updated": "2026-02-21", "type": "chat" }, { - "id": "qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash (Preview)", + "display_name": "Gemini 3 Flash (Preview)", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048756, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "Qwen2.5 72B", - "display_name": "Qwen2.5 72B", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro (Preview Custom Tools)", + "display_name": "Gemini 3.1 Pro (Preview Custom Tools)", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048756, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-03", - "last_updated": "2025-07-03", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen/qwq-32b-preview", - "name": "Qwen QwQ 32B Preview", - "display_name": "Qwen QwQ 32B Preview", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B", + "display_name": "Gemma 4 26B A4B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 131072 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 258048, + "context": 1048576, "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen3.5-plus-thinking", - "name": "Qwen3.5 Plus Thinking", - "display_name": "Qwen3.5 Plus Thinking", + "id": "google/gemini-3-flash-preview-thinking", + "name": "Gemini 3 Flash Thinking", + "display_name": "Gemini 3 Flash Thinking", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 983616, + "context": 1048756, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -33637,91 +34979,121 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen3 Next 80B A3B (Instruct)", - "display_name": "Qwen3 Next 80B A3B (Instruct)", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-11", - "last_updated": "2025-09-11", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "qwen/Qwen2.5-Coder-32B-Instruct", - "name": "Qwen 2.5 Coder 32b", - "display_name": "Qwen 2.5 Coder 32b", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 131072 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-03", - "last_updated": "2025-07-03", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/Qwen3.6-35B-A3B:thinking", - "name": "Qwen3.6 35B A3B Thinking", - "display_name": "Qwen3.6 35B A3B Thinking", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro (Preview)", + "display_name": "Gemini 3.1 Pro (Preview)", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048756, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -33729,248 +35101,255 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-19", - "last_updated": "2026-04-19", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen/qwen3-coder", - "name": "Qwen 3 Coder 480B", - "display_name": "Qwen 3 Coder 480B", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash Lite Latest", + "display_name": "Gemini Flash Lite Latest", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, + "context": 1048576, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "google/gemini-3.1-pro-preview-low", + "name": "Gemini 3.1 Pro (Preview Low)", + "display_name": "Gemini 3.1 Pro (Preview Low)", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048756, "output": 65536 }, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", - "type": "chat" - }, - { - "id": "qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen 3 235b A22B 2507 Thinking", - "display_name": "Qwen 3 235b A22B 2507 Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 262144 - }, - "tool_call": false, - "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-11", - "last_updated": "2025-09-11", + "release_date": "2026-02-21", + "last_updated": "2026-02-21", "type": "chat" }, { - "id": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", - "name": "EVA-Qwen2.5-32B-v0.2", - "display_name": "EVA-Qwen2.5-32B-v0.2", + "id": "thinkingmachines/inkling:thinking", + "name": "Inkling Thinking", + "display_name": "Inkling Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1048000, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", - "name": "EVA-LLaMA-3.33-70B-v0.1", - "display_name": "EVA-LLaMA-3.33-70B-v0.1", + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 524288, + "output": 32768 }, - "tool_call": false, - "reasoning": { + "temperature": true, + "tool_call": true, + "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", - "name": "EVA Llama 3.33 70B", - "display_name": "EVA Llama 3.33 70B", + "id": "thinkingmachines/Inkling-Small:thinking", + "name": "Inkling Small Thinking", + "display_name": "Inkling Small Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 524288, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", - "name": "EVA-Qwen2.5-72B-v0.2", - "display_name": "EVA-Qwen2.5-72B-v0.2", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1048000, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "tencent/hy3-preview", - "name": "Tencent: Hy3 preview", - "display_name": "Tencent: Hy3 preview", + "id": "zai-org/glm-4.6v", + "name": "GLM 4.6V", + "display_name": "GLM 4.6V", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 24000 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "tencent/Hunyuan-MT-7B", - "name": "Hunyuan MT 7B", - "display_name": "Hunyuan MT 7B", + "id": "zai-org/glm-5", + "name": "GLM 5", + "display_name": "GLM 5", "modalities": { "input": [ "text" @@ -33980,23 +35359,36 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "THUDM/GLM-Z1-9B-0414", - "name": "GLM Z1 9B 0414", - "display_name": "GLM Z1 9B 0414", + "id": "zai-org/glm-5:thinking", + "name": "GLM 5 Thinking", + "display_name": "GLM 5 Thinking", "modalities": { "input": [ "text" @@ -34006,23 +35398,25 @@ ] }, "limit": { - "context": 32000, - "output": 8000 + "context": 200000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "THUDM/GLM-Z1-32B-0414", - "name": "GLM Z1 32B 0414", - "display_name": "GLM Z1 32B 0414", + "id": "zai-org/GLM-4.5:thinking", + "name": "GLM 4.5 (Thinking)", + "display_name": "GLM 4.5 (Thinking)", "modalities": { "input": [ "text" @@ -34035,20 +35429,23 @@ "context": 128000, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "THUDM/GLM-4-32B-0414", - "name": "GLM 4 32B 0414", - "display_name": "GLM 4 32B 0414", + "id": "zai-org/glm-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ "text" @@ -34058,23 +35455,30 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 200000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "THUDM/GLM-4-9B-0414", - "name": "GLM 4 9B 0414", - "display_name": "GLM 4 9B 0414", + "id": "zai-org/glm-4.6-original", + "name": "GLM 4.6 Original", + "display_name": "GLM 4.6 Original", "modalities": { "input": [ "text" @@ -34084,23 +35488,24 @@ ] }, "limit": { - "context": 32000, - "output": 8000 + "context": 256000, + "output": 65535 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "abacusai/Dracarys-72B-Instruct", - "name": "Llama 3.1 70B Dracarys 2", - "display_name": "Llama 3.1 70B Dracarys 2", + "id": "zai-org/GLM-4.5-Air", + "name": "GLM 4.5 Air", + "display_name": "GLM 4.5 Air", "modalities": { "input": [ "text" @@ -34110,23 +35515,25 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 128000, + "output": 98304 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-02", - "last_updated": "2025-08-02", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "pamanseau/OpenReasoning-Nemotron-32B", - "name": "OpenReasoning Nemotron 32B", - "display_name": "OpenReasoning Nemotron 32B", + "id": "zai-org/glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ "text" @@ -34136,50 +35543,31 @@ ] }, "limit": { - "context": 32768, - "output": 65536 + "context": 200000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", - "type": "chat" - }, - { - "id": "upstage/solar-pro-3", - "name": "Solar Pro 3", - "display_name": "Solar Pro 3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "GalrionSoftworks/MN-LooseCannon-12B-v1", - "name": "MN-LooseCannon-12B-v1", - "display_name": "MN-LooseCannon-12B-v1", + "id": "zai-org/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -34189,23 +35577,30 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistralai/Devstral-Small-2505", - "name": "Mistral Devstral Small 2505", - "display_name": "Mistral Devstral Small 2505", + "id": "zai-org/glm-4.7-original", + "name": "GLM 4.7 Original", + "display_name": "GLM 4.7 Original", "modalities": { "input": [ "text" @@ -34215,23 +35610,24 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 200000, + "output": 65535 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-02", - "last_updated": "2025-08-02", + "open_weights": true, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "mistralai/mistral-large", - "name": "Mistral Large 2411", - "display_name": "Mistral Large 2411", + "id": "zai-org/glm-5-original", + "name": "GLM 5 Original", + "display_name": "GLM 5 Original", "modalities": { "input": [ "text" @@ -34241,51 +35637,51 @@ ] }, "limit": { - "context": 128000, - "output": 256000 + "context": 200000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-02-26", - "last_updated": "2024-02-26", + "open_weights": true, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "mistralai/mistral-small-4-119b-2603:thinking", - "name": "Mistral Small 4 119B Thinking", - "display_name": "Mistral Small 4 119B Thinking", + "id": "zai-org/glm-5-original:thinking", + "name": "GLM 5 Original Thinking", + "display_name": "GLM 5 Original Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "mistralai/Mistral-Nemo-Instruct-2407", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "zai-org/glm-4.7-flash-original", + "name": "GLM 4.7 Flash Original", + "display_name": "GLM 4.7 Flash Original", "modalities": { "input": [ "text" @@ -34295,23 +35691,24 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 200000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": true, + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "mistralai/devstral-2-123b-instruct-2512", - "name": "Devstral 2 123B", - "display_name": "Devstral 2 123B", + "id": "zai-org/GLM-4.6-turbo:thinking", + "name": "GLM 4.6 Turbo (Thinking)", + "display_name": "GLM 4.6 Turbo (Thinking)", "modalities": { "input": [ "text" @@ -34321,23 +35718,24 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 204800 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "open_weights": true, + "release_date": "2025-10-02", + "last_updated": "2025-10-02", "type": "chat" }, { - "id": "mistralai/ministral-8b-2512", - "name": "Ministral 8B", - "display_name": "Ministral 8B", + "id": "zai-org/glm-5.1:thinking", + "name": "GLM 5.1 Thinking", + "display_name": "GLM 5.1 Thinking", "modalities": { "input": [ "text" @@ -34347,23 +35745,25 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-04", - "last_updated": "2025-12-04", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "mistralai/ministral-14b-2512", - "name": "Ministral 14B", - "display_name": "Ministral 14B", + "id": "zai-org/glm-4.5", + "name": "GLM 4.5", + "display_name": "GLM 4.5", "modalities": { "input": [ "text" @@ -34373,23 +35773,25 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-04", - "last_updated": "2025-12-04", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "mistralai/ministral-3b-2512", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "zai-org/glm-4.7-original:thinking", + "name": "GLM 4.7 Original Thinking", + "display_name": "GLM 4.7 Original Thinking", "modalities": { "input": [ "text" @@ -34399,105 +35801,90 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 65535 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-04", - "last_updated": "2025-12-04", + "open_weights": true, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "mistralai/mistral-small-4-119b-2603", - "name": "Mistral Small 4 119B", - "display_name": "Mistral Small 4 119B", + "id": "zai-org/glm-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 65535 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" - }, - { - "id": "mistralai/mistral-large-3-675b-instruct-2512", - "name": "Mistral Large 3 675B", - "display_name": "Mistral Large 3 675B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 256000 - }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "mistralai/ministral-14b-instruct-2512", - "name": "Ministral 3 14B", - "display_name": "Ministral 3 14B", + "id": "zai-org/GLM-4.6-turbo", + "name": "GLM 4.6 Turbo", + "display_name": "GLM 4.6 Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 204800 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-02", + "last_updated": "2025-10-02", "type": "chat" }, { - "id": "mistralai/mixtral-8x22b-instruct-v0.1", - "name": "Mixtral 8x22B", - "display_name": "Mixtral 8x22B", + "id": "zai-org/glm-latest", + "name": "GLM Latest", + "display_name": "GLM Latest", "modalities": { "input": [ "text" @@ -34507,23 +35894,24 @@ ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "mistralai/mixtral-8x7b-instruct-v0.1", - "name": "Mixtral 8x7B", - "display_name": "Mixtral 8x7B", + "id": "zai-org/GLM-4.5-Air:thinking", + "name": "GLM 4.5 Air (Thinking)", + "display_name": "GLM 4.5 Air (Thinking)", "modalities": { "input": [ "text" @@ -34533,75 +35921,81 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 128000, + "output": 98304 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.1", - "name": "Mistral Medium 3.1", - "display_name": "Mistral Medium 3.1", + "id": "zai-org/glm-4.6v-flash-original", + "name": "GLM 4.6V Flash", + "display_name": "GLM 4.6V Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 24000 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "mistralai/mistral-saba", - "name": "Mistral Saba", - "display_name": "Mistral Saba", + "id": "zai-org/glm-4.6v-original", + "name": "GLM 4.6V Original", + "display_name": "GLM 4.6V Original", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32768 + "context": 128000, + "output": 24000 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-02-17", - "last_updated": "2025-02-17", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "mistralai/codestral-2508", - "name": "Codestral 2508", - "display_name": "Codestral 2508", + "id": "zai-org/glm-4.7-flash:thinking", + "name": "GLM 4.7 Flash Thinking", + "display_name": "GLM 4.7 Flash Thinking", "modalities": { "input": [ "text" @@ -34611,50 +36005,53 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 200000, + "output": 128000 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-01", - "last_updated": "2025-08-01", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "mistralai/mistral-medium-3", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "zai-org/glm-4.7-flash-original:thinking", + "name": "GLM 4.7 Flash Original Thinking", + "display_name": "GLM 4.7 Flash Original Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 128000 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "attachment": false, + "open_weights": true, + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "soob3123/amoral-gemma3-27B-v2", - "name": "Amoral Gemma3 27B v2", - "display_name": "Amoral Gemma3 27B v2", + "id": "zai-org/glm-5.2:thinking", + "name": "GLM 5.2 Thinking", + "display_name": "GLM 5.2 Thinking", "modalities": { "input": [ "text" @@ -34664,23 +36061,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-23", - "last_updated": "2025-05-23", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "soob3123/GrayLine-Qwen3-8B", - "name": "Grayline Qwen3 8B", - "display_name": "Grayline Qwen3 8B", + "id": "zai-org/glm-4.7:thinking", + "name": "GLM 4.7 Thinking", + "display_name": "GLM 4.7 Thinking", "modalities": { "input": [ "text" @@ -34690,23 +36089,26 @@ ] }, "limit": { - "context": 16384, - "output": 32768 + "context": 200000, + "output": 65535 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "soob3123/Veiled-Calla-12B", - "name": "Veiled Calla 12B", - "display_name": "Veiled Calla 12B", + "id": "featherless-ai/Qwerky-72B", + "name": "Qwerky 72B", + "display_name": "Qwerky 72B", "modalities": { "input": [ "text" @@ -34716,7 +36118,7 @@ ] }, "limit": { - "context": 32768, + "context": 32000, "output": 8192 }, "tool_call": false, @@ -34724,18 +36126,19 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-13", - "last_updated": "2025-04-13", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "nex-agi/deepseek-v3.1-nex-n1", - "name": "DeepSeek V3.1 Nex N1", - "display_name": "DeepSeek V3.1 Nex N1", + "id": "unsloth/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" @@ -34749,45 +36152,47 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-10", - "last_updated": "2025-12-10", + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "inflatebot/MN-12B-Mag-Mell-R1", - "name": "Mag Mell R1", - "display_name": "Mag Mell R1", + "id": "unsloth/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 128000, + "output": 96000 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "LLM360/K2-Think", - "name": "K2-Think", - "display_name": "K2-Think", + "id": "unsloth/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" @@ -34795,52 +36200,55 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 131072 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "undi95/remm-slerp-l2-13b", - "name": "ReMM SLERP 13B", - "display_name": "ReMM SLERP 13B", + "id": "perceptron/perceptron-mk1", + "name": "Perceptron Mk1", + "display_name": "Perceptron Mk1", "modalities": { "input": [ "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 6144, - "output": 4096 + "context": 32768, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "nanogpt/coding-router:max", - "name": "Coding Router Max", - "display_name": "Coding Router Max", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -34848,26 +36256,28 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 16384 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "nanogpt/coding-router:medium", - "name": "Coding Router Medium", - "display_name": "Coding Router Medium", + "id": "sakana/fugu-ultra-v1.1", + "name": "Fugu Ultra v1.1", + "display_name": "Fugu Ultra v1.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -34875,23 +36285,23 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 16384 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "nanogpt/coding-router:high", - "name": "Coding Router High", - "display_name": "Coding Router High", + "id": "Steelskull/L3.3-MS-Nevoria-70b", + "name": "Steelskull Nevoria 70b", + "display_name": "Steelskull Nevoria 70b", "modalities": { "input": [ "text" @@ -34901,24 +36311,23 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "nanogpt/coding-router:low", - "name": "Coding Router Low", - "display_name": "Coding Router Low", + "id": "Steelskull/L3.3-MS-Evayale-70B", + "name": "Evayale 70b ", + "display_name": "Evayale 70b ", "modalities": { "input": [ "text" @@ -34928,24 +36337,23 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "nanogpt/coding-router", - "name": "Coding Router", - "display_name": "Coding Router", + "id": "Steelskull/L3.3-Cu-Mai-R1-70b", + "name": "Llama 3.3 70B Cu Mai", + "display_name": "Llama 3.3 70B Cu Mai", "modalities": { "input": [ "text" @@ -34955,24 +36363,23 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "mlabonne/NeuralDaredevil-8B-abliterated", - "name": "Neural Daredevil 8B abliterated", - "display_name": "Neural Daredevil 8B abliterated", + "id": "Steelskull/L3.3-Electra-R1-70b", + "name": "Steelskull Electra R1 70b", + "display_name": "Steelskull Electra R1 70b", "modalities": { "input": [ "text" @@ -34982,23 +36389,23 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 16384, + "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "essentialai/rnj-1-instruct", - "name": "RNJ-1 Instruct 8B", - "display_name": "RNJ-1 Instruct 8B", + "id": "Steelskull/L3.3-Nevoria-R1-70b", + "name": "Steelskull Nevoria R1 70b", + "display_name": "Steelskull Nevoria R1 70b", "modalities": { "input": [ "text" @@ -35008,49 +36415,63 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 16384, + "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-13", - "last_updated": "2025-12-13", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M1-80k", - "name": "MiniMax M1 80K", - "display_name": "MiniMax M1 80K", + "id": "qwen/qwen3-32b", + "name": "Qwen 3 32b", + "display_name": "Qwen 3 32b", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 41000, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-06-16", - "last_updated": "2025-06-16", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "Unbabel/M-Prometheus-14B", - "name": "M-Prometheus 14B", - "display_name": "M-Prometheus 14B", + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -35060,23 +36481,34 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 41000, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": true, + "release_date": "2025-02-27", + "last_updated": "2025-02-27", "type": "chat" }, { - "id": "inclusionai/ring-2.6-1t", - "name": "Ring 2.6 1T", - "display_name": "Ring 2.6 1T", + "id": "qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen 3 235b A22B 2507", + "display_name": "Qwen 3 235b A22B 2507", "modalities": { "input": [ "text" @@ -35086,50 +36518,64 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 262144 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-08", - "last_updated": "2026-05-08", + "open_weights": true, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "inclusionai/ling-2.6-1t", - "name": "Ling 2.6 1T", - "display_name": "Ling 2.6 1T", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 - }, - "tool_call": true, + "context": 983616, + "output": 65536 + }, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "inclusionai/ling-2.6-flash", - "name": "Ling 2.6 Flash", - "display_name": "Ling 2.6 Flash", + "id": "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "name": "Qwen 3 235b A22B 2507 (TEE)", + "display_name": "Qwen 3 235b A22B 2507 (TEE)", "modalities": { "input": [ "text" @@ -35139,23 +36585,23 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 262144 }, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": true, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "cognitivecomputations/dolphin-2.9.2-qwen2-72b", - "name": "Dolphin 72b", - "display_name": "Dolphin 72b", + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B (Thinking)", + "display_name": "Qwen3 Next 80B A3B (Thinking)", "modalities": { "input": [ "text" @@ -35165,53 +36611,80 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 256000, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "allenai/olmo-3-32b-think", - "name": "Olmo 3 32B Think", - "display_name": "Olmo 3 32B Think", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 256000, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "Salesforce/Llama-xLAM-2-70b-fc-r", - "name": "Llama-xLAM-2 70B fc-r", - "display_name": "Llama-xLAM-2 70B fc-r", + "id": "qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -35219,22 +36692,22 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 262144 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-13", - "last_updated": "2025-04-13", + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", - "name": "Omega Directive 24B Unslop v2.0", - "display_name": "Omega Directive 24B Unslop v2.0", + "id": "qwen/qwen3-14b", + "name": "Qwen 3 14b", + "display_name": "Qwen 3 14b", "modalities": { "input": [ "text" @@ -35244,79 +36717,111 @@ ] }, "limit": { - "context": 16384, + "context": 41000, "output": 32768 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "mistral/mistral-medium-3.5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "qwen/Qwen3-8B", + "name": "Qwen 3 8B", + "display_name": "Qwen 3 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 41000, "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "mistral/mistral-medium-3.5:thinking", - "name": "Mistral Medium 3.5 Thinking", - "display_name": "Mistral Medium 3.5 Thinking", + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen 3 235b A22B", + "display_name": "Qwen 3 235b A22B", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 41000, "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "meganova-ai/manta-pro-1.0", - "name": "Manta Pro 1.0", - "display_name": "Manta Pro 1.0", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -35326,49 +36831,77 @@ ] }, "limit": { - "context": 32768, + "context": 256000, "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-12-20", - "last_updated": "2025-12-20", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "meganova-ai/manta-mini-1.0", - "name": "Manta Mini 1.0", - "display_name": "Manta Mini 1.0", + "id": "qwen/qwen3.5-397b-a17b-thinking", + "name": "Qwen3.5 397B A17B Thinking", + "display_name": "Qwen3.5 397B A17B Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 258048, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-20", - "last_updated": "2025-12-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "meganova-ai/manta-flash-1.0", - "name": "Manta Flash 1.0", - "display_name": "Manta Flash 1.0", + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -35378,23 +36911,25 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 128000, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-12-20", - "last_updated": "2025-12-20", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", - "name": "MS3.2 24B Magnum Diamond", - "display_name": "MS3.2 24B Magnum Diamond", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -35404,49 +36939,65 @@ ] }, "limit": { - "context": 16384, - "output": 32768 + "context": 128000, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "chutesai/Mistral-Small-3.2-24B-Instruct-2506", - "name": "Mistral Small 3.2 24b Instruct", - "display_name": "Mistral Small 3.2 24b Instruct", + "id": "qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 262144, + "output": 16384 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", - "name": "Mistral Nemo Starcannon 12b v1", - "display_name": "Mistral Nemo Starcannon 12b v1", + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B", + "display_name": "Qwen2.5 72B", "modalities": { "input": [ "text" @@ -35456,7 +37007,7 @@ ] }, "limit": { - "context": 16384, + "context": 131072, "output": 8192 }, "tool_call": false, @@ -35464,67 +37015,97 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": true, + "release_date": "2025-07-03", + "last_updated": "2025-07-03", "type": "chat" }, { - "id": "shisa-ai/shisa-v2.1-llama3.3-70b", - "name": "Shisa V2.1 Llama 3.3 70B", - "display_name": "Shisa V2.1 Llama 3.3 70B", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 258048, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "shisa-ai/shisa-v2-llama3.3-70b", - "name": "Shisa V2 Llama 3.3 70B", - "display_name": "Shisa V2 Llama 3.3 70B", + "id": "qwen/qwen3.5-plus-thinking", + "name": "Qwen3.5 Plus Thinking", + "display_name": "Qwen3.5 Plus Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 983616, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "poolside/laguna-xs.2", - "name": "Laguna XS.2", - "display_name": "Laguna XS.2", + "id": "qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3 Next 80B A3B (Instruct)", + "display_name": "Qwen3 Next 80B A3B (Instruct)", "modalities": { "input": [ "text" @@ -35534,25 +37115,25 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "poolside/laguna-m.1", - "name": "Laguna M.1", - "display_name": "Laguna M.1", + "id": "qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen 2.5 Coder 32b", + "display_name": "Qwen 2.5 Coder 32b", "modalities": { "input": [ "text" @@ -35561,31 +37142,65 @@ "text" ] }, + "limit": { + "context": 32000, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-03", + "last_updated": "2025-07-03", + "type": "chat" + }, + { + "id": "qwen/Qwen3.6-35B-A3B:thinking", + "name": "Qwen3.6 35B A3B Thinking", + "display_name": "Qwen3.6 35B A3B Thinking", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, "limit": { "context": 262144, - "output": 32768 + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", - "name": "Llama 3.1 70B Celeste v0.1", - "display_name": "Llama 3.1 70B Celeste v0.1", + "id": "qwen/qwen3-coder", + "name": "Qwen 3 Coder 480B", + "display_name": "Qwen 3 Coder 480B", "modalities": { "input": [ "text" @@ -35595,23 +37210,23 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 262000, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": true, + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "dmind/dmind-1", - "name": "DMind-1", - "display_name": "DMind-1", + "id": "qwen/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -35621,23 +37236,23 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "open_weights": true, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "dmind/dmind-1-mini", - "name": "DMind-1-Mini", - "display_name": "DMind-1-Mini", + "id": "qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen 3 235b A22B 2507 Thinking", + "display_name": "Qwen 3 235b A22B 2507 Thinking", "modalities": { "input": [ "text" @@ -35647,23 +37262,34 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 256000, + "output": 262144 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "open_weights": true, + "release_date": "2025-09-11", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", - "name": "Llama 3 70B abliterated", - "display_name": "Llama 3 70B abliterated", + "id": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", + "name": "EVA-Qwen2.5-32B-v0.2", + "display_name": "EVA-Qwen2.5-32B-v0.2", "modalities": { "input": [ "text" @@ -35673,7 +37299,7 @@ ] }, "limit": { - "context": 8192, + "context": 16384, "output": 8192 }, "tool_call": false, @@ -35681,15 +37307,15 @@ "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2025-07-26", "last_updated": "2025-07-26", "type": "chat" }, { - "id": "minimax/minimax-m2-her", - "name": "MiniMax M2-her", - "display_name": "MiniMax M2-her", + "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", + "name": "EVA-LLaMA-3.33-70B-v0.1", + "display_name": "EVA-LLaMA-3.33-70B-v0.1", "modalities": { "input": [ "text" @@ -35699,23 +37325,23 @@ ] }, "limit": { - "context": 65532, - "output": 2048 + "context": 16384, + "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-24", - "last_updated": "2026-01-24", + "open_weights": true, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "minimax/minimax-m2.7-turbo", - "name": "MiniMax M2.7 Turbo", - "display_name": "MiniMax M2.7 Turbo", + "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", + "name": "EVA Llama 3.33 70B", + "display_name": "EVA Llama 3.33 70B", "modalities": { "input": [ "text" @@ -35725,24 +37351,23 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", + "name": "EVA-Qwen2.5-72B-v0.2", + "display_name": "EVA-Qwen2.5-72B-v0.2", "modalities": { "input": [ "text" @@ -35752,95 +37377,82 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 16384, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": true, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "minimax/minimax-m3:thinking", - "name": "MiniMax M3 Thinking", - "display_name": "MiniMax M3 Thinking", + "id": "tencent/hy3", + "name": "Tencent Hy3", + "display_name": "Tencent Hy3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 80000 + "context": 262144, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "tencent/Hunyuan-MT-7B", + "name": "Hunyuan MT 7B", + "display_name": "Hunyuan MT 7B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 80000 + "context": 8192, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2025-08-15", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "THUDM/GLM-Z1-9B-0414", + "name": "GLM Z1 9B 0414", + "display_name": "GLM Z1 9B 0414", "modalities": { "input": [ "text" @@ -35850,56 +37462,49 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32000, + "output": 8000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "minimax/minimax-01", - "name": "MiniMax 01", - "display_name": "MiniMax 01", + "id": "THUDM/GLM-4-32B-0414", + "name": "GLM 4 32B 0414", + "display_name": "GLM 4 32B 0414", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000192, - "output": 16384 + "context": 128000, + "output": 65536 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "THUDM/GLM-4-9B-0414", + "name": "GLM 4 9B 0414", + "display_name": "GLM 4 9B 0414", "modalities": { "input": [ "text" @@ -35909,57 +37514,49 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32000, + "output": 8000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-19", - "last_updated": "2025-12-19", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "minimax/minimax-latest", - "name": "MiniMax Latest", - "display_name": "MiniMax Latest", + "id": "abacusai/Dracarys-72B-Instruct", + "name": "Llama 3.1 70B Dracarys 2", + "display_name": "Llama 3.1 70B Dracarys 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 80000 + "context": 16384, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-02", + "last_updated": "2025-08-02", "type": "chat" }, { - "id": "MarinaraSpaghetti/NemoMix-Unleashed-12B", - "name": "NemoMix 12B Unleashed", - "display_name": "NemoMix 12B Unleashed", + "id": "pamanseau/OpenReasoning-Nemotron-32B", + "name": "OpenReasoning Nemotron 32B", + "display_name": "OpenReasoning Nemotron 32B", "modalities": { "input": [ "text" @@ -35970,22 +37567,23 @@ }, "limit": { "context": 32768, - "output": 8192 + "output": 65536 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash:thinking", - "name": "DeepSeek V4 Flash (Thinking)", - "display_name": "DeepSeek V4 Flash (Thinking)", + "id": "upstage/solar-pro-3", + "name": "Solar Pro 3", + "display_name": "Solar Pro 3", "modalities": { "input": [ "text" @@ -35995,24 +37593,23 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 128000, + "output": 128000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "deepseek/deepseek-latest", - "name": "DeepSeek Latest", - "display_name": "DeepSeek Latest", + "id": "GalrionSoftworks/MN-LooseCannon-12B-v1", + "name": "MN-LooseCannon-12B-v1", + "display_name": "MN-LooseCannon-12B-v1", "modalities": { "input": [ "text" @@ -36022,24 +37619,23 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 16384, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "mistralai/Devstral-Small-2505", + "name": "Mistral Devstral Small 2505", + "display_name": "Mistral Devstral Small 2505", "modalities": { "input": [ "text" @@ -36049,101 +37645,77 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 32768, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": true, + "release_date": "2025-08-02", + "last_updated": "2025-08-02", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-speciale", - "name": "DeepSeek V3.2 Speciale", - "display_name": "DeepSeek V3.2 Speciale", + "id": "mistralai/mistral-large", + "name": "Mistral Large 2411", + "display_name": "Mistral Large 2411", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163000, - "output": 65536 + "context": 128000, + "output": 256000 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2024-01-01", + "last_updated": "2024-02-26", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "mistralai/mistral-small-4-119b-2603:thinking", + "name": "Mistral Small 4 119B Thinking", + "display_name": "Mistral Small 4 119B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 16384 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": true, + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-cheaper", - "name": "DeepSeek V4 Pro Cheaper", - "display_name": "DeepSeek V4 Pro Cheaper", + "id": "mistralai/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ "text" @@ -36153,56 +37725,49 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 16384, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-25", - "last_updated": "2026-04-25", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "mistralai/devstral-2-123b-instruct-2512", + "name": "Devstral 2 123B", + "display_name": "Devstral 2 123B", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163000, + "context": 262144, "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro:thinking", - "name": "DeepSeek V4 Pro (Thinking)", - "display_name": "DeepSeek V4 Pro (Thinking)", + "id": "mistralai/ministral-8b-2512", + "name": "Ministral 8B", + "display_name": "Ministral 8B", "modalities": { "input": [ "text" @@ -36212,24 +37777,23 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": true, + "release_date": "2025-12-04", + "last_updated": "2025-12-04", "type": "chat" }, { - "id": "deepseek/deepseek-prover-v2-671b", - "name": "DeepSeek Prover v2 671B", - "display_name": "DeepSeek Prover v2 671B", + "id": "mistralai/ministral-14b-2512", + "name": "Ministral 14B", + "display_name": "Ministral 14B", "modalities": { "input": [ "text" @@ -36239,130 +37803,131 @@ ] }, "limit": { - "context": 160000, - "output": 16384 + "context": 262144, + "output": 32768 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-30", - "last_updated": "2025-04-30", + "open_weights": true, + "release_date": "2025-12-04", + "last_updated": "2025-12-04", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2:thinking", - "name": "DeepSeek V3.2 Thinking", - "display_name": "DeepSeek V3.2 Thinking", + "id": "mistralai/ministral-3b-2512", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163000, - "output": 65536 + "context": 131072, + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-04", + "last_updated": "2025-12-04", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-cheaper:thinking", - "name": "DeepSeek V4 Pro Cheaper (Thinking)", - "display_name": "DeepSeek V4 Pro Cheaper (Thinking)", + "id": "mistralai/mistral-small-4-119b-2603", + "name": "Mistral Small 4 119B", + "display_name": "Mistral Small 4 119B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 16384 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-25", - "last_updated": "2026-04-25", + "attachment": true, + "open_weights": true, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "amazon/nova-2-lite-v1", - "name": "Amazon Nova 2 Lite", - "display_name": "Amazon Nova 2 Lite", + "id": "mistralai/mistral-large-3-675b-instruct-2512", + "name": "Mistral Large 3 675B", + "display_name": "Mistral Large 3 675B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 262144, + "output": 256000 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-25", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "amazon/nova-pro-v1", - "name": "Amazon Nova Pro 1.0", - "display_name": "Amazon Nova Pro 1.0", + "id": "mistralai/ministral-14b-instruct-2512", + "name": "Ministral 3 14B", + "display_name": "Ministral 3 14B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 32000 + "context": 262144, + "output": 32768 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "amazon/nova-micro-v1", - "name": "Amazon Nova Micro 1.0", - "display_name": "Amazon Nova Micro 1.0", + "id": "mistralai/mixtral-8x22b-instruct-v0.1", + "name": "Mixtral 8x22B", + "display_name": "Mixtral 8x22B", "modalities": { "input": [ "text" @@ -36372,23 +37937,23 @@ ] }, "limit": { - "context": 128000, - "output": 5120 + "context": 65536, + "output": 65536 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "open_weights": true, + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "amazon/nova-lite-v1", - "name": "Amazon Nova Lite 1.0", - "display_name": "Amazon Nova Lite 1.0", + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral Medium 3.1", + "display_name": "Mistral Medium 3.1", "modalities": { "input": [ "text" @@ -36398,8 +37963,8 @@ ] }, "limit": { - "context": 300000, - "output": 5120 + "context": 131072, + "output": 32768 }, "tool_call": false, "reasoning": { @@ -36407,14 +37972,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "Gryphe/MythoMax-L2-13b", - "name": "MythoMax 13B", - "display_name": "MythoMax 13B", + "id": "mistralai/mistral-saba", + "name": "Mistral Saba", + "display_name": "Mistral Saba", "modalities": { "input": [ "text" @@ -36424,23 +37989,23 @@ ] }, "limit": { - "context": 4000, - "output": 4096 + "context": 32000, + "output": 32768 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-02-17", "type": "chat" }, { - "id": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", - "name": "Llama 3.3 70B Wayfarer", - "display_name": "Llama 3.3 70B Wayfarer", + "id": "mistralai/codestral-2508", + "name": "Codestral 2508", + "display_name": "Codestral 2508", "modalities": { "input": [ "text" @@ -36450,8 +38015,8 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 256000, + "output": 32768 }, "tool_call": false, "reasoning": { @@ -36459,17 +38024,18 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-02-20", - "last_updated": "2025-02-20", + "release_date": "2025-08-01", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "ibm-granite/granite-4.1-8b", - "name": "Granite 4.1 8B", - "display_name": "Granite 4.1 8B", + "id": "mistralai/mistral-medium-3", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -36477,22 +38043,22 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "x-ai/grok-4.20-multi-agent", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", + "id": "bytedance/doubao-seed-character", + "name": "Doubao Seed Character", + "display_name": "Doubao Seed Character", "modalities": { "input": [ "text", @@ -36503,61 +38069,53 @@ ] }, "limit": { - "context": 2000000, - "output": 131072 + "context": 128000, + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "release_date": "2026-07-18", + "last_updated": "2026-07-18", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "bytedance/doubao-seed-2.1-turbo", + "name": "Doubao Seed 2.1 Turbo", + "display_name": "Doubao Seed 2.1 Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 256000, + "output": 128000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "bytedance/doubao-seed-2.1-pro", + "name": "Doubao Seed 2.1 Pro", + "display_name": "Doubao Seed 2.1 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -36565,28 +38123,100 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 128000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-20", - "last_updated": "2026-05-20", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "x-ai/grok-4.20", - "name": "Grok 4.20", - "display_name": "Grok 4.20", + "id": "soob3123/amoral-gemma3-27B-v2", + "name": "Amoral Gemma3 27B v2", + "display_name": "Amoral Gemma3 27B v2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-05-23", + "last_updated": "2025-05-23", + "type": "chat" + }, + { + "id": "soob3123/GrayLine-Qwen3-8B", + "name": "Grayline Qwen3 8B", + "display_name": "Grayline Qwen3 8B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 32768 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "type": "chat" + }, + { + "id": "soob3123/Veiled-Calla-12B", + "name": "Veiled Calla 12B", + "display_name": "Veiled Calla 12B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-04-13", + "last_updated": "2025-04-13", + "type": "chat" + }, + { + "id": "nex-agi/nex-n2-mini", + "name": "Nex N2 Mini", + "display_name": "Nex N2 Mini", "modalities": { "input": [ "text", @@ -36597,8 +38227,8 @@ ] }, "limit": { - "context": 2000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "tool_call": true, "reasoning": { @@ -36606,15 +38236,15 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "open_weights": true, + "release_date": "2026-06-24", + "last_updated": "2026-06-24", "type": "chat" }, { - "id": "x-ai/grok-latest", - "name": "Grok Latest", - "display_name": "Grok Latest", + "id": "nex-agi/nex-n2-pro", + "name": "Nex N2 Pro", + "display_name": "Nex N2 Pro", "modalities": { "input": [ "text", @@ -36625,8 +38255,8 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 262144, + "output": 262144 }, "tool_call": true, "reasoning": { @@ -36634,133 +38264,128 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "alibaba/qwen3.6-27b:thinking", - "name": "Qwen3.6 27B Thinking", - "display_name": "Qwen3.6 27B Thinking", + "id": "inflatebot/MN-12B-Mag-Mell-R1", + "name": "Mag Mell R1", + "display_name": "Mag Mell R1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 16384, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", + "type": "chat" + }, + { + "id": "LLM360/K2-Think", + "name": "K2-Think", + "display_name": "K2-Think", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "limit": { + "context": 128000, + "output": 32768 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "alibaba/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "display_name": "ReMM SLERP 13B", "modalities": { "input": [ "text", - "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 6144, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "alibaba/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 991800, + "context": 1000000, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "kwaipilot/kat-coder-pro-v2", - "name": "KAT Coder Pro V2", - "display_name": "KAT Coder Pro V2", + "id": "nanogpt/coding-router:max", + "name": "Coding Router Max", + "display_name": "Coding Router Max", "modalities": { "input": [ "text" @@ -36770,23 +38395,24 @@ ] }, "limit": { - "context": 256000, - "output": 80000 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", - "name": "Llama 3.05 Storybreaker Ministral 70b", - "display_name": "Llama 3.05 Storybreaker Ministral 70b", + "id": "nanogpt/coding-router:medium", + "name": "Coding Router Medium", + "display_name": "Coding Router Medium", "modalities": { "input": [ "text" @@ -36796,23 +38422,24 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", - "name": "Nemotron Tenyxchat Storybreaker 70b", - "display_name": "Nemotron Tenyxchat Storybreaker 70b", + "id": "nanogpt/coding-router:high", + "name": "Coding Router High", + "display_name": "Coding Router High", "modalities": { "input": [ "text" @@ -36822,23 +38449,24 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "NeverSleep/Lumimaid-v0.2-70B", - "name": "Lumimaid v0.2", - "display_name": "Lumimaid v0.2", + "id": "nanogpt/coding-router:low", + "name": "Coding Router Low", + "display_name": "Coding Router Low", "modalities": { "input": [ "text" @@ -36848,23 +38476,24 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "Sao10K/L3.3-70B-Euryale-v2.3", - "name": "Llama 3.3 70B Euryale", - "display_name": "Llama 3.3 70B Euryale", + "id": "nanogpt/coding-router", + "name": "Coding Router", + "display_name": "Coding Router", "modalities": { "input": [ "text" @@ -36874,23 +38503,24 @@ ] }, "limit": { - "context": 20480, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "Sao10K/L3-8B-Stheno-v3.2", - "name": "Sao10K Stheno 8b", - "display_name": "Sao10K Stheno 8b", + "id": "mlabonne/NeuralDaredevil-8B-abliterated", + "name": "Neural Daredevil 8B abliterated", + "display_name": "Neural Daredevil 8B abliterated", "modalities": { "input": [ "text" @@ -36900,7 +38530,7 @@ ] }, "limit": { - "context": 16384, + "context": 8192, "output": 8192 }, "tool_call": false, @@ -36908,15 +38538,15 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-11-29", - "last_updated": "2024-11-29", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "Sao10K/L3.1-70B-Euryale-v2.2", - "name": "Llama 3.1 70B Euryale", - "display_name": "Llama 3.1 70B Euryale", + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMax M1 80K", + "display_name": "MiniMax M1 80K", "modalities": { "input": [ "text" @@ -36926,8 +38556,8 @@ ] }, "limit": { - "context": 20480, - "output": 16384 + "context": 1000000, + "output": 131072 }, "tool_call": false, "reasoning": { @@ -36935,14 +38565,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2025-01-08", + "last_updated": "2025-06-16", "type": "chat" }, { - "id": "Sao10K/L3.1-70B-Hanami-x1", - "name": "Llama 3.1 70B Hanami", - "display_name": "Llama 3.1 70B Hanami", + "id": "inclusionai/ling-3.0-flash", + "name": "Ling 3.0 Flash", + "display_name": "Ling 3.0 Flash", "modalities": { "input": [ "text" @@ -36952,23 +38582,28 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 262144, + "output": 32768 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.2-exp", - "name": "DeepSeek V3.2 Exp", - "display_name": "DeepSeek V3.2 Exp", + "id": "inclusionai/ring-2.6-1t", + "name": "Ring 2.6 1T", + "display_name": "Ring 2.6 1T", "modalities": { "input": [ "text" @@ -36978,23 +38613,50 @@ ] }, "limit": { - "context": 163840, + "context": 262144, "output": 65536 }, - "tool_call": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-08", + "last_updated": "2026-05-08", + "type": "chat" + }, + { + "id": "inclusionai/ling-2.6-1t", + "name": "Ling 2.6 1T", + "display_name": "Ling 2.6 1T", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "inclusionai/ling-3.0-flash:thinking", + "name": "Ling 3.0 Flash Thinking", + "display_name": "Ling 3.0 Flash Thinking", "modalities": { "input": [ "text" @@ -37004,62 +38666,50 @@ ] }, "limit": { - "context": 128000, - "output": 163840 + "context": 262144, + "output": 32768 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": false, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "inclusionai/ling-2.6-flash", + "name": "Ling 2.6 Flash", + "display_name": "Ling 2.6 Flash", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 262144, + "output": 32768 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.2-exp-thinking", - "name": "DeepSeek V3.2 Exp Thinking", - "display_name": "DeepSeek V3.2 Exp Thinking", + "id": "Salesforce/Llama-xLAM-2-70b-fc-r", + "name": "Llama-xLAM-2 70B fc-r", + "display_name": "Llama-xLAM-2 70B fc-r", "modalities": { "input": [ "text" @@ -37069,24 +38719,23 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 128000, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-04-13", + "last_updated": "2025-04-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1:thinking", - "name": "DeepSeek V3.1 Thinking", - "display_name": "DeepSeek V3.1 Thinking", + "id": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", + "name": "Omega Directive 24B Unslop v2.0", + "display_name": "Omega Directive 24B Unslop v2.0", "modalities": { "input": [ "text" @@ -37096,23 +38745,23 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 16384, + "output": 32768 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "open_weights": true, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", - "name": "DeepSeek V3.1 Terminus (Thinking)", - "display_name": "DeepSeek V3.1 Terminus (Thinking)", + "id": "crofai/greg-2-super", + "name": "Greg 2 Super", + "display_name": "Greg 2 Super", "modalities": { "input": [ "text" @@ -37122,8 +38771,8 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 229376, + "output": 229376 }, "tool_call": true, "reasoning": { @@ -37131,14 +38780,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "release_date": "2026-06-19", + "last_updated": "2026-06-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "DeepSeek V3.1 Terminus", - "display_name": "DeepSeek V3.1 Terminus", + "id": "crofai/greg-2-ultra", + "name": "Greg 2 Ultra", + "display_name": "Greg 2 Ultra", "modalities": { "input": [ "text" @@ -37148,8 +38797,8 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 229376, + "output": 229376 }, "tool_call": true, "reasoning": { @@ -37157,40 +38806,70 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-08-02", - "last_updated": "2025-08-02", + "release_date": "2026-06-19", + "last_updated": "2026-06-19", "type": "chat" }, { - "id": "aion-labs/aion-1.0-mini", - "name": "Aion 1.0 mini (DeepSeek)", - "display_name": "Aion 1.0 mini (DeepSeek)", + "id": "mistral/mistral-medium-3.5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 256000, + "output": 32768 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", + "type": "chat" + }, + { + "id": "mistral/mistral-medium-3.5:thinking", + "name": "Mistral Medium 3.5 Thinking", + "display_name": "Mistral Medium 3.5 Thinking", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 256000, + "output": 32768 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-02-20", - "last_updated": "2025-02-20", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "aion-labs/aion-2.0", - "name": "AionLabs: Aion-2.0", - "display_name": "AionLabs: Aion-2.0", + "id": "meganova-ai/manta-pro-1.0", + "name": "Manta Pro 1.0", + "display_name": "Manta Pro 1.0", "modalities": { "input": [ "text" @@ -37200,7 +38879,7 @@ ] }, "limit": { - "context": 131072, + "context": 32768, "output": 32768 }, "tool_call": false, @@ -37209,14 +38888,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2025-09-20", + "last_updated": "2025-12-20", "type": "chat" }, { - "id": "aion-labs/aion-1.0", - "name": "Aion 1.0", - "display_name": "Aion 1.0", + "id": "meganova-ai/manta-mini-1.0", + "name": "Manta Mini 1.0", + "display_name": "Manta Mini 1.0", "modalities": { "input": [ "text" @@ -37226,7 +38905,7 @@ ] }, "limit": { - "context": 65536, + "context": 8192, "output": 8192 }, "tool_call": false, @@ -37235,14 +38914,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-02-01", - "last_updated": "2025-02-01", + "release_date": "2025-09-20", + "last_updated": "2025-12-20", "type": "chat" }, { - "id": "aion-labs/aion-rp-llama-3.1-8b", - "name": "Llama 3.1 8b (uncensored)", - "display_name": "Llama 3.1 8b (uncensored)", + "id": "meganova-ai/manta-flash-1.0", + "name": "Manta Flash 1.0", + "display_name": "Manta Flash 1.0", "modalities": { "input": [ "text" @@ -37252,7 +38931,7 @@ ] }, "limit": { - "context": 32768, + "context": 16384, "output": 16384 }, "tool_call": false, @@ -37261,14 +38940,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2025-09-20", + "last_updated": "2025-12-20", "type": "chat" }, { - "id": "aion-labs/aion-2.5", - "name": "AionLabs: Aion-2.5", - "display_name": "AionLabs: Aion-2.5", + "id": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", + "name": "MS3.2 24B Magnum Diamond", + "display_name": "MS3.2 24B Magnum Diamond", "modalities": { "input": [ "text" @@ -37278,7 +38957,7 @@ ] }, "limit": { - "context": 131072, + "context": 16384, "output": 32768 }, "tool_call": false, @@ -37286,15 +38965,15 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-20", - "last_updated": "2026-03-20", + "open_weights": true, + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "inflection/inflection-3-pi", - "name": "Inflection 3 Pi", - "display_name": "Inflection 3 Pi", + "id": "chutesai/Mistral-Small-3.2-24B-Instruct-2506", + "name": "Mistral Small 3.2 24b Instruct", + "display_name": "Mistral Small 3.2 24b Instruct", "modalities": { "input": [ "text" @@ -37304,23 +38983,23 @@ ] }, "limit": { - "context": 8000, - "output": 4096 + "context": 128000, + "output": 131072 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-10-11", - "last_updated": "2024-10-11", + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "inflection/inflection-3-productivity", - "name": "Inflection 3 Productivity", - "display_name": "Inflection 3 Productivity", + "id": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", + "name": "Mistral Nemo Starcannon 12b v1", + "display_name": "Mistral Nemo Starcannon 12b v1", "modalities": { "input": [ "text" @@ -37330,53 +39009,49 @@ ] }, "limit": { - "context": 8000, - "output": 4096 + "context": 16384, + "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-10-11", - "last_updated": "2024-10-11", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "xiaomi/mimo-v2-omni", - "name": "MiMo V2 Omni", - "display_name": "MiMo V2 Omni", + "id": "shisa-ai/shisa-v2.1-llama3.3-70b", + "name": "Shisa V2.1 Llama 3.3 70B", + "display_name": "Shisa V2.1 Llama 3.3 70B", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 32768, + "output": 4096 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "xiaomi/mimo-v2-flash", - "name": "MiMo V2 Flash", - "display_name": "MiMo V2 Flash", + "id": "shisa-ai/shisa-v2-llama3.3-70b", + "name": "Shisa V2 Llama 3.3 70B", + "display_name": "Shisa V2 Llama 3.3 70B", "modalities": { "input": [ "text" @@ -37386,24 +39061,23 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 128000, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "xiaomi/mimo-v2-pro", - "name": "MiMo V2 Pro", - "display_name": "MiMo V2 Pro", + "id": "poolside/laguna-s-2.1:thinking", + "name": "Laguna S 2.1 Thinking", + "display_name": "Laguna S 2.1 Thinking", "modalities": { "input": [ "text" @@ -37416,26 +39090,25 @@ "context": 1048576, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "open_weights": true, + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo V2.5", - "display_name": "MiMo V2.5", + "id": "poolside/laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -37445,21 +39118,27 @@ "context": 1048576, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "xiaomi/mimo-v2-flash-thinking", - "name": "MiMo V2 Flash (Thinking)", - "display_name": "MiMo V2 Flash (Thinking)", + "id": "poolside/laguna-m.1", + "name": "Laguna M.1", + "display_name": "Laguna M.1", "modalities": { "input": [ "text" @@ -37469,24 +39148,24 @@ ] }, "limit": { - "context": 256000, + "context": 262144, "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "xiaomi/mimo-v2-flash-original", - "name": "MiMo V2 Flash Original", - "display_name": "MiMo V2 Flash Original", + "id": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", + "name": "Llama 3.1 70B Celeste v0.1", + "display_name": "Llama 3.1 70B Celeste v0.1", "modalities": { "input": [ "text" @@ -37496,24 +39175,23 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 16384, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "dmind/dmind-1-mini", + "name": "DMind-1-Mini", + "display_name": "DMind-1-Mini", "modalities": { "input": [ "text" @@ -37523,24 +39201,23 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32768, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2024-01-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "xiaomi/mimo-v2-flash-thinking-original", - "name": "MiMo V2 Flash (Thinking) Original", - "display_name": "MiMo V2 Flash (Thinking) Original", + "id": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", + "name": "Llama 3 70B abliterated", + "display_name": "Llama 3 70B abliterated", "modalities": { "input": [ "text" @@ -37550,151 +39227,89 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 8192, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8:thinking", - "name": "Claude Opus 4.8 Thinking", - "display_name": "Claude Opus 4.8 Thinking", + "id": "minimax/minimax-m2-her", + "name": "MiniMax M2-her", + "display_name": "MiniMax M2-her", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 65532, + "output": 2048 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2025-01-12", + "last_updated": "2026-01-24", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "minimax/minimax-m2.7-turbo", + "name": "MiniMax M2.7 Turbo", + "display_name": "MiniMax M2.7 Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking", - "name": "Claude 4.6 Opus Thinking", - "display_name": "Claude 4.6 Opus Thinking", + "id": "minimax/minimax-m2.7", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -37703,158 +39318,122 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic/claude-sonnet-latest", - "name": "Claude Sonnet Latest", - "display_name": "Claude Sonnet Latest", + "id": "minimax/minimax-m3:thinking", + "name": "MiniMax M3 Thinking", + "display_name": "MiniMax M3 Thinking", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 512000, + "output": 80000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "anthropic/claude-opus-latest", - "name": "Claude Opus Latest", - "display_name": "Claude Opus Latest", + "id": "minimax/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 512000, + "output": 80000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude 4.7 Opus", - "display_name": "Claude 4.7 Opus", + "id": "minimax/minimax-m2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6:thinking", - "name": "Claude Sonnet 4.6 Thinking", - "display_name": "Claude Sonnet 4.6 Thinking", + "id": "minimax/minimax-01", + "name": "MiniMax 01", + "display_name": "MiniMax 01", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -37862,9 +39441,36 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1000192, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2025-01-15", + "type": "chat" + }, + { + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -37872,56 +39478,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "anthropic/claude-haiku-latest", - "name": "Claude Haiku Latest", - "display_name": "Claude Haiku Latest", + "id": "minimax/minimax-latest", + "name": "MiniMax Latest", + "display_name": "MiniMax Latest", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 512000, + "output": 80000 }, "tool_call": true, "reasoning": { @@ -37929,196 +39510,110 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "open_weights": true, + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking:medium", - "name": "Claude 4.6 Opus Thinking Medium", - "display_name": "Claude 4.6 Opus Thinking Medium", + "id": "MarinaraSpaghetti/NemoMix-Unleashed-12B", + "name": "NemoMix 12B Unleashed", + "display_name": "NemoMix 12B Unleashed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7:thinking", - "name": "Claude 4.7 Opus Thinking", - "display_name": "Claude 4.7 Opus Thinking", + "id": "deepseek/deepseek-v4-flash:thinking", + "name": "DeepSeek V4 Flash (Thinking)", + "display_name": "DeepSeek V4 Flash (Thinking)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "deepseek/deepseek-latest", + "name": "DeepSeek Latest", + "display_name": "DeepSeek Latest", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking:max", - "name": "Claude 4.6 Opus Thinking Max", - "display_name": "Claude 4.6 Opus Thinking Max", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38127,46 +39622,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking:low", - "name": "Claude 4.6 Opus Thinking Low", - "display_name": "Claude 4.6 Opus Thinking Low", + "id": "deepseek/deepseek-v4-flash-0731:thinking", + "name": "DeepSeek V4 Flash 0731 (Thinking)", + "display_name": "DeepSeek V4 Flash 0731 (Thinking)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -38174,108 +39651,65 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude 4.6 Opus", - "display_name": "Claude 4.6 Opus", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "liquid/lfm-2-24b-a2b", - "name": "LFM2 24B A2B", - "display_name": "LFM2 24B A2B", + "id": "deepseek/deepseek-v4-pro-cheaper", + "name": "DeepSeek V4 Pro Cheaper", + "display_name": "DeepSeek V4 Pro Cheaper", "modalities": { "input": [ "text" @@ -38285,23 +39719,24 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-20", - "last_updated": "2025-12-20", + "open_weights": true, + "release_date": "2026-04-25", + "last_updated": "2026-04-25", "type": "chat" }, { - "id": "Infermatic/MN-12B-Inferor-v0.0", - "name": "Mistral Nemo Inferor 12B", - "display_name": "Mistral Nemo Inferor 12B", + "id": "deepseek/deepseek-v4-flash-0731-cheaper:thinking", + "name": "DeepSeek V4 Flash 0731 Cheaper (Thinking)", + "display_name": "DeepSeek V4 Flash 0731 Cheaper (Thinking)", "modalities": { "input": [ "text" @@ -38311,23 +39746,24 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": true, + "release_date": "2026-08-01", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "stepfun-ai/step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "deepseek/deepseek-v4-flash-0731-cheaper", + "name": "DeepSeek V4 Flash 0731 Cheaper", + "display_name": "DeepSeek V4 Flash 0731 Cheaper", "modalities": { "input": [ "text" @@ -38337,24 +39773,24 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-02", - "last_updated": "2026-02-02", + "open_weights": true, + "release_date": "2026-08-01", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "stepfun-ai/step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -38364,50 +39800,63 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-14", - "last_updated": "2026-04-14", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "NousResearch/hermes-3-llama-3.1-70b", - "name": "Hermes 3 70B", - "display_name": "Hermes 3 70B", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 163000, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-07", - "last_updated": "2026-01-07", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "NousResearch/hermes-4-405b:thinking", - "name": "Hermes 4 Large (Thinking)", - "display_name": "Hermes 4 Large (Thinking)", + "id": "deepseek/deepseek-v4-flash-latest", + "name": "DeepSeek V4 Flash Latest", + "display_name": "DeepSeek V4 Flash Latest", "modalities": { "input": [ "text" @@ -38417,23 +39866,24 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "release_date": "2026-08-02", + "last_updated": "2026-08-02", "type": "chat" }, { - "id": "NousResearch/hermes-4-405b", - "name": "Hermes 4 Large", - "display_name": "Hermes 4 Large", + "id": "deepseek/deepseek-v4-pro:thinking", + "name": "DeepSeek V4 Pro (Thinking)", + "display_name": "DeepSeek V4 Pro (Thinking)", "modalities": { "input": [ "text" @@ -38443,23 +39893,26 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "NousResearch/Hermes-4-70B:thinking", - "name": "Hermes 4 (Thinking)", - "display_name": "Hermes 4 (Thinking)", + "id": "deepseek/deepseek-prover-v2-671b", + "name": "DeepSeek Prover v2 671B", + "display_name": "DeepSeek Prover v2 671B", "modalities": { "input": [ "text" @@ -38469,49 +39922,51 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 160000, + "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-17", - "last_updated": "2025-09-17", + "open_weights": true, + "release_date": "2025-11-15", + "last_updated": "2025-04-30", "type": "chat" }, { - "id": "NousResearch/DeepHermes-3-Mistral-24B-Preview", - "name": "DeepHermes-3 Mistral 24B (Preview)", - "display_name": "DeepHermes-3 Mistral 24B (Preview)", + "id": "deepseek/deepseek-v3.2:thinking", + "name": "DeepSeek V3.2 Thinking", + "display_name": "DeepSeek V3.2 Thinking", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 163000, + "output": 65536 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-05-10", - "last_updated": "2025-05-10", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "NousResearch/hermes-4-70b", - "name": "Hermes 4 Medium", - "display_name": "Hermes 4 Medium", + "id": "deepseek/deepseek-v4-pro-cheaper:thinking", + "name": "DeepSeek V4 Pro Cheaper (Thinking)", + "display_name": "DeepSeek V4 Pro Cheaper (Thinking)", "modalities": { "input": [ "text" @@ -38521,51 +39976,50 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-03", - "last_updated": "2025-07-03", + "open_weights": true, + "release_date": "2026-04-25", + "last_updated": "2026-04-25", "type": "chat" }, { - "id": "z-ai/glm-4.5v:thinking", - "name": "GLM 4.5V Thinking", - "display_name": "GLM 4.5V Thinking", + "id": "amazon/nova-2-lite-v1", + "name": "Amazon Nova 2 Lite", + "display_name": "Amazon Nova 2 Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 96000 + "context": 1000000, + "output": 65535 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-11-22", - "last_updated": "2025-11-22", + "release_date": "2024-01-01", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "amazon/nova-pro-v1", + "name": "Amazon Nova Pro 1.0", + "display_name": "Amazon Nova Pro 1.0", "modalities": { "input": [ "text" @@ -38575,57 +40029,49 @@ ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 300000, + "output": 32000 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "z-ai/glm-4.5v", - "name": "GLM 4.5V", - "display_name": "GLM 4.5V", + "id": "amazon/nova-micro-v1", + "name": "Amazon Nova Micro 1.0", + "display_name": "Amazon Nova Micro 1.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 96000 + "context": 128000, + "output": 5120 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-11-22", - "last_updated": "2025-11-22", + "release_date": "2024-01-01", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM 5 Turbo", - "display_name": "GLM 5 Turbo", + "id": "amazon/nova-lite-v1", + "name": "Amazon Nova Lite 1.0", + "display_name": "Amazon Nova Lite 1.0", "modalities": { "input": [ "text" @@ -38635,55 +40081,49 @@ ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 300000, + "output": 5120 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM 5V Turbo", - "display_name": "GLM 5V Turbo", + "id": "Gryphe/MythoMax-L2-13b", + "name": "MythoMax 13B", + "display_name": "MythoMax 13B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131100 + "context": 4000, + "output": 4096 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "type": "chat" }, { - "id": "z-ai/glm-4.6:thinking", - "name": "GLM 4.6 Thinking", - "display_name": "GLM 4.6 Thinking", + "id": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", + "name": "Llama 3.3 70B Wayfarer", + "display_name": "Llama 3.3 70B Wayfarer", "modalities": { "input": [ "text" @@ -38693,78 +40133,77 @@ ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-02-20", + "last_updated": "2025-02-20", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo:thinking", - "name": "GLM 5V Turbo Thinking", - "display_name": "GLM 5V Turbo Thinking", + "id": "ibm-granite/granite-4.1-8b", + "name": "Granite 4.1 8B", + "display_name": "Granite 4.1 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131100 + "context": 131072, + "output": 131072 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", - "name": "Tongyi DeepResearch 30B A3B", - "display_name": "Tongyi DeepResearch 30B A3B", + "id": "x-ai/grok-4.20-multi-agent", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 2000000, + "output": 131072 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -38775,34 +40214,30 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 1000000, + "output": 1000000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-26", - "last_updated": "2026-01-26", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6:thinking", - "name": "Kimi K2.6 Thinking", - "display_name": "Kimi K2.6 Thinking", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -38813,50 +40248,30 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 500000, + "output": 500000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-16", - "last_updated": "2026-04-21", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "moonshotai/kimi-k2-instruct-0711", - "name": "Kimi K2 0711", - "display_name": "Kimi K2 0711", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", - "type": "chat" - }, - { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", @@ -38868,11 +40283,13 @@ }, "limit": { "context": 256000, - "output": 65536 + "output": 256000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -38880,136 +40297,168 @@ } }, "attachment": true, - "open_weights": true, + "open_weights": false, "release_date": "2026-04-16", - "last_updated": "2026-04-21", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking-original", - "name": "Kimi K2 Thinking Original", - "display_name": "Kimi K2 Thinking Original", + "id": "x-ai/grok-4.20", + "name": "Grok 4.20", + "display_name": "Grok 4.20", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 2000000, + "output": 131072 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Instruct-0905", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", + "id": "x-ai/grok-latest", + "name": "Grok Latest", + "display_name": "Grok Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 500000, + "output": 500000 }, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "moonshotai/kimi-latest", - "name": "Kimi Latest", - "display_name": "Kimi Latest", + "id": "alibaba/qwen3.6-27b:thinking", + "name": "Qwen3.6 27B Thinking", + "display_name": "Qwen3.6 27B Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 260096, "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking-turbo-original", - "name": "Kimi K2 Thinking Turbo Original", - "display_name": "Kimi K2 Thinking Turbo Original", + "id": "alibaba/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 260096, + "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "alibaba/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 991808, + "output": 65536 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true }, @@ -39024,16 +40473,42 @@ ] } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", + "type": "chat" + }, + { + "id": "kwaipilot/kat-coder-pro-v2", + "name": "KAT Coder Pro V2", + "display_name": "KAT Coder Pro V2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 80000 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": false, - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "moonshotai/kimi-k2-instruct", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "kwaipilot/kat-coder-pro-v2.5", + "name": "KAT Coder Pro V2.5", + "display_name": "KAT Coder Pro V2.5", "modalities": { "input": [ "text" @@ -39044,7 +40519,7 @@ }, "limit": { "context": 256000, - "output": 8192 + "output": 80000 }, "tool_call": true, "reasoning": { @@ -39052,18 +40527,17 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-07-01", - "last_updated": "2025-07-01", + "release_date": "2026-07-14", + "last_updated": "2026-07-14", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5:thinking", - "name": "Kimi K2.5 Thinking", - "display_name": "Kimi K2.5 Thinking", + "id": "kwaipilot/kat-coder-air-v2.5", + "name": "KAT Coder Air V2.5", + "display_name": "KAT Coder Air V2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -39071,257 +40545,204 @@ }, "limit": { "context": 256000, - "output": 65536 + "output": 80000 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-01-26", - "last_updated": "2026-01-26", + "release_date": "2026-07-14", + "last_updated": "2026-07-14", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT 5.1 Codex Mini", - "display_name": "GPT 5.1 Codex Mini", + "id": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", + "name": "Llama 3.05 Storybreaker Ministral 70b", + "display_name": "Llama 3.05 Storybreaker Ministral 70b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 8192 }, "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "openai/gpt-chat-latest", - "name": "GPT Chat Latest", - "display_name": "GPT Chat Latest", + "id": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", + "name": "Nemotron Tenyxchat Storybreaker 70b", + "display_name": "Nemotron Tenyxchat Storybreaker 70b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT 5.2 Pro", - "display_name": "GPT 5.2 Pro", + "id": "NeverSleep/Lumimaid-v0.2-70B", + "name": "Lumimaid v0.2", + "display_name": "Lumimaid v0.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", + "type": "chat" + }, + { + "id": "Sao10K/L3.3-70B-Euryale-v2.3", + "name": "Llama 3.3 70B Euryale", + "display_name": "Llama 3.3 70B Euryale", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "release_date": "2026-01-01", - "last_updated": "2026-01-01", + "limit": { + "context": 20480, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT 4.1 Mini", - "display_name": "GPT 4.1 Mini", + "id": "Sao10K/L3-8B-Stheno-v3.2", + "name": "Sao10K Stheno 8b", + "display_name": "Sao10K Stheno 8b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 16384, + "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-11-29", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "Sao10K/L3.1-70B-Euryale-v2.2", + "name": "Llama 3.1 70B Euryale", + "display_name": "Llama 3.1 70B Euryale", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 20480, "output": 16384 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT 5.4 Pro", - "display_name": "GPT 5.4 Pro", + "id": "Sao10K/L3.1-70B-Hanami-x1", + "name": "Llama 3.1 70B Hanami", + "display_name": "Llama 3.1 70B Hanami", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 922000, - "output": 128000 + "context": 16384, + "output": 16384 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/o3-mini-high", - "name": "OpenAI o3-mini (High)", - "display_name": "OpenAI o3-mini (High)", + "id": "deepseek-ai/deepseek-v3.2-exp", + "name": "DeepSeek V3.2 Exp", + "display_name": "DeepSeek V3.2 Exp", "modalities": { "input": [ "text" @@ -39331,38 +40752,23 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 163840, + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-5.1-2025-11-13", - "name": "GPT-5.1 (2025-11-13)", - "display_name": "GPT-5.1 (2025-11-13)", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", "modalities": { "input": [ "text" @@ -39372,49 +40778,38 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 128000, + "output": 163840 }, "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT 4.1 Nano", - "display_name": "GPT 4.1 Nano", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -39422,23 +40817,23 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 65536 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "deepseek-ai/deepseek-v3.2-exp-thinking", + "name": "DeepSeek V3.2 Exp Thinking", + "display_name": "DeepSeek V3.2 Exp Thinking", "modalities": { "input": [ "text" @@ -39448,29 +40843,24 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 163840, + "output": 65536 }, "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", + "id": "deepseek-ai/DeepSeek-V3.1:thinking", + "name": "DeepSeek V3.1 Thinking", + "display_name": "DeepSeek V3.1 Thinking", "modalities": { "input": [ "text" @@ -39481,23 +40871,22 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 65536 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "OpenAI o3-mini", - "display_name": "OpenAI o3-mini", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", + "name": "DeepSeek V3.1 Terminus (Thinking)", + "display_name": "DeepSeek V3.1 Terminus (Thinking)", "modalities": { "input": [ "text" @@ -39507,165 +40896,102 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 65536 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT 5.5", - "display_name": "GPT 5.5", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "display_name": "DeepSeek V3.1 Terminus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 65536 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-02", + "last_updated": "2025-08-02", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "aion-labs/aion-2.0", + "name": "AionLabs: Aion-2.0", + "display_name": "AionLabs: Aion-2.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 32768 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT 5", - "display_name": "GPT 5", + "id": "aion-labs/aion-3.0-mini", + "name": "AionLabs: Aion 3.0 Mini", + "display_name": "AionLabs: Aion 3.0 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-07-07", + "last_updated": "2026-07-07", "type": "chat" }, { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI o4-mini Deep Research", - "display_name": "OpenAI o4-mini Deep Research", + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "Llama 3.1 8b (uncensored)", + "display_name": "Llama 3.1 8b (uncensored)", "modalities": { "input": [ "text" @@ -39675,38 +41001,23 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32768, + "output": 16384 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/o4-mini-high", - "name": "OpenAI o4-mini high", - "display_name": "OpenAI o4-mini high", + "id": "aion-labs/aion-3.0", + "name": "AionLabs: Aion 3.0", + "display_name": "AionLabs: Aion 3.0", "modalities": { "input": [ "text" @@ -39716,38 +41027,24 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 32768 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": false, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-07-07", + "last_updated": "2026-07-07", "type": "chat" }, { - "id": "openai/o3-deep-research", - "name": "OpenAI o3 Deep Research", - "display_name": "OpenAI o3 Deep Research", + "id": "aion-labs/aion-2.5", + "name": "AionLabs: Aion-2.5", + "display_name": "AionLabs: Aion-2.5", "modalities": { "input": [ "text" @@ -39757,38 +41054,23 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 32768 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-03-20", + "last_updated": "2026-03-20", "type": "chat" }, { - "id": "openai/gpt-5-codex", - "name": "GPT-5 Codex", - "display_name": "GPT-5 Codex", + "id": "inflection/inflection-3-pi", + "name": "Inflection 3 Pi", + "display_name": "Inflection 3 Pi", "modalities": { "input": [ "text" @@ -39798,45 +41080,23 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 8000, + "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "release_date": "2025-11-21", + "last_updated": "2024-10-11", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5 Turbo", - "display_name": "GPT-3.5 Turbo", + "id": "inflection/inflection-3-productivity", + "name": "Inflection 3 Productivity", + "display_name": "Inflection 3 Productivity", "modalities": { "input": [ "text" @@ -39846,7 +41106,7 @@ ] }, "limit": { - "context": 16385, + "context": 8000, "output": 4096 }, "tool_call": false, @@ -39855,138 +41115,161 @@ }, "attachment": false, "open_weights": false, - "release_date": "2022-11-30", - "last_updated": "2024-01-01", + "release_date": "2025-11-21", + "last_updated": "2024-10-11", "type": "chat" }, { - "id": "openai/gpt-latest", - "name": "GPT Latest", - "display_name": "GPT Latest", + "id": "xiaomi/mimo-v2.5:thinking", + "name": "MiMo V2.5 Thinking", + "display_name": "MiMo V2.5 Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/o1-preview", - "name": "OpenAI o1-preview", - "display_name": "OpenAI o1-preview", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo V2.5", + "display_name": "MiMo V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": true, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "xiaomi/mimo-v2.5-pro-crof", + "name": "MiMo V2.5 Pro (Crof)", + "display_name": "MiMo V2.5 Pro (Crof)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-09-12", - "last_updated": "2024-09-12", + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "xiaomi/mimo-v2.5-pro:thinking", + "name": "MiMo V2.5 Pro Thinking", + "display_name": "MiMo V2.5 Pro Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-4o-search-preview", - "name": "GPT-4o Search Preview", - "display_name": "GPT-4o Search Preview", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/o3-pro-2025-06-10", - "name": "OpenAI o3-pro (2025-06-10)", - "display_name": "OpenAI o3-pro (2025-06-10)", + "id": "xiaomi/mimo-v2.5-pro-crof:thinking", + "name": "MiMo V2.5 Pro Thinking (Crof)", + "display_name": "MiMo V2.5 Pro Thinking (Crof)", "modalities": { "input": [ "text" @@ -39996,38 +41279,24 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": false, - "open_weights": false, - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT 5.4", - "display_name": "GPT 5.4", + "id": "anthropic/claude-opus-4.8:thinking", + "name": "Claude Opus 4.8 Thinking", + "display_name": "Claude Opus 4.8 Thinking", "modalities": { "input": [ "text", @@ -40039,46 +41308,52 @@ ] }, "limit": { - "context": 922000, + "context": 1000000, "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT 5.2 Codex", - "display_name": "GPT 5.2 Codex", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -40090,45 +41365,54 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT 5.4 Nano", - "display_name": "GPT 5.4 Nano", + "id": "anthropic/claude-opus-4.6:thinking", + "name": "Claude 4.6 Opus Thinking", + "display_name": "Claude 4.6 Opus Thinking", "modalities": { "input": [ "text", @@ -40140,60 +41424,70 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT 5 Pro", - "display_name": "GPT 5 Pro", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -40202,27 +41496,39 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", + "mode": "effort", "effort": "high", - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT 5.4 Mini", - "display_name": "GPT 5.4 Mini", + "id": "anthropic/claude-sonnet-latest", + "name": "Claude Sonnet Latest", + "display_name": "Claude Sonnet Latest", "modalities": { "input": [ "text", @@ -40234,131 +41540,125 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "anthropic/claude-opus-latest", + "name": "Claude Opus Latest", + "display_name": "Claude Opus Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "openai/o1", - "name": "OpenAI o1", - "display_name": "OpenAI o1", + "id": "anthropic/claude-opus-4.7", + "name": "Claude 4.7 Opus", + "display_name": "Claude 4.7 Opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-12-17", - "last_updated": "2024-12-17", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/o3-mini-low", - "name": "OpenAI o3-mini (Low)", - "display_name": "OpenAI o3-mini (Low)", + "id": "anthropic/claude-sonnet-4.6:thinking", + "name": "Claude Sonnet 4.6 Thinking", + "display_name": "Claude Sonnet 4.6 Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -40368,26 +41668,41 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT 5.2", - "display_name": "GPT 5.2", + "id": "anthropic/claude-sonnet-5:thinking", + "name": "Claude Sonnet 5 Thinking", + "display_name": "Claude Sonnet 5 Thinking", "modalities": { "input": [ "text", @@ -40399,46 +41714,32 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "default_enabled": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-01", - "last_updated": "2026-01-01", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT 5.3 Codex", - "display_name": "GPT 5.3 Codex", + "id": "anthropic/claude-haiku-latest", + "name": "Claude Haiku Latest", + "display_name": "Claude Haiku Latest", "modalities": { "input": [ "text", @@ -40450,59 +41751,39 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT 5 Mini", - "display_name": "GPT 5 Mini", + "id": "anthropic/claude-fable-latest", + "name": "Claude Fable Latest", + "display_name": "Claude Fable Latest", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -40512,32 +41793,37 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "OpenAI o1 Pro", - "display_name": "OpenAI o1 Pro", + "id": "anthropic/claude-opus-4.6:thinking:medium", + "name": "Claude 4.6 Opus Thinking Medium", + "display_name": "Claude 4.6 Opus Thinking Medium", "modalities": { "input": [ "text", @@ -40549,10 +41835,11 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -40561,26 +41848,41 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-01-25", - "last_updated": "2025-01-25", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT 5.1", - "display_name": "GPT 5.1", + "id": "anthropic/claude-opus-4.7:thinking", + "name": "Claude 4.7 Opus Thinking", + "display_name": "Claude 4.7 Opus Thinking", "modalities": { "input": [ "text", @@ -40592,139 +41894,68 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", - "type": "chat" - }, - { - "id": "openai/gpt-4-turbo-preview", - "name": "GPT-4 Turbo Preview", - "display_name": "GPT-4 Turbo Preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2024-01-01", - "type": "chat" - }, - { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2024-01-01", - "type": "chat" - }, - { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT 5.1 Codex", - "display_name": "GPT 5.1 Codex", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": false @@ -40734,120 +41965,125 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT 5 Nano", - "display_name": "GPT 5 Nano", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-4o-mini-search-preview", - "name": "GPT-4o mini Search Preview", - "display_name": "GPT-4o mini Search Preview", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/o3", - "name": "OpenAI o3", - "display_name": "OpenAI o3", + "id": "anthropic/claude-opus-4.6:thinking:max", + "name": "Claude 4.6 Opus Thinking Max", + "display_name": "Claude 4.6 Opus Thinking Max", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -40856,26 +42092,41 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT 4.1", - "display_name": "GPT 4.1", + "id": "anthropic/claude-opus-4.6:thinking:low", + "name": "Claude 4.6 Opus Thinking Low", + "display_name": "Claude 4.6 Opus Thinking Low", "modalities": { "input": [ "text", @@ -40887,35 +42138,10 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-10", - "last_updated": "2025-09-10", - "type": "chat" - }, - { - "id": "openai/o4-mini", - "name": "OpenAI o4-mini", - "display_name": "OpenAI o4-mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -40925,26 +42151,41 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT 5.1 Codex Max", - "display_name": "GPT 5.1 Codex Max", + "id": "anthropic/claude-opus-4.6", + "name": "Claude 4.6 Opus", + "display_name": "Claude 4.6 Opus", "modalities": { "input": [ "text", @@ -40956,9 +42197,10 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -40968,60 +42210,70 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "baidu/ernie-4.5-vl-28b-a3b", - "name": "ERNIE 4.5 VL 28B", - "display_name": "ERNIE 4.5 VL 28B", + "id": "stepfun-ai/step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 256000, + "output": 256000 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Llama 3.3 70b Instruct", - "display_name": "Llama 3.3 70b Instruct", + "id": "stepfun-ai/step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ "text" @@ -41031,104 +42283,104 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 256000, + "output": 256000 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "meta-llama/llama-4-maverick", - "name": "Llama 4 Maverick", - "display_name": "Llama 4 Maverick", + "id": "NousResearch/hermes-3-llama-3.1-70b", + "name": "Hermes 3 70B", + "display_name": "Hermes 3 70B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 65536, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-01-07", + "last_updated": "2026-01-07", "type": "chat" }, { - "id": "meta-llama/llama-4-scout", - "name": "Llama 4 Scout", - "display_name": "Llama 4 Scout", + "id": "NousResearch/hermes-4-405b:thinking", + "name": "Hermes 4 Large (Thinking)", + "display_name": "Hermes 4 Large (Thinking)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 328000, - "output": 65536 + "context": 128000, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "meta-llama/llama-3.2-3b-instruct", - "name": "Llama 3.2 3b Instruct", - "display_name": "Llama 3.2 3b Instruct", + "id": "NousResearch/hermes-4-405b", + "name": "Hermes 4 Large", + "display_name": "Hermes 4 Large", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Llama 3.1 8b Instruct", - "display_name": "Llama 3.1 8b Instruct", + "id": "NousResearch/Hermes-4-70B:thinking", + "name": "Hermes 4 (Thinking)", + "display_name": "Hermes 4 (Thinking)", "modalities": { "input": [ "text" @@ -41138,23 +42390,23 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 128000, + "output": 8192 }, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": true, + "release_date": "2025-09-17", + "last_updated": "2025-09-17", "type": "chat" }, { - "id": "arcee-ai/trinity-mini", - "name": "Trinity Mini", - "display_name": "Trinity Mini", + "id": "NousResearch/hermes-4-70b", + "name": "Hermes 4 Medium", + "display_name": "Hermes 4 Medium", "modalities": { "input": [ "text" @@ -41164,7 +42416,7 @@ ] }, "limit": { - "context": 131072, + "context": 128000, "output": 8192 }, "tool_call": false, @@ -41172,42 +42424,45 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": true, + "release_date": "2025-07-03", + "last_updated": "2025-07-03", "type": "chat" }, { - "id": "arcee-ai/trinity-large-thinking", - "name": "Trinity Large Thinking", - "display_name": "Trinity Large Thinking", + "id": "z-ai/glm-4.5v:thinking", + "name": "GLM 4.5V Thinking", + "display_name": "GLM 4.5V Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 80000 + "context": 64000, + "output": 96000 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-lite", - "name": "ByteDance Seed 2.0 Lite", - "display_name": "ByteDance Seed 2.0 Lite", + "id": "z-ai/glm-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", "modalities": { "input": [ "text" @@ -41217,75 +42472,61 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 200000, + "output": 65535 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-10", - "last_updated": "2026-03-10", - "type": "chat" - }, - { - "id": "TheDrummer/Cydonia-24B-v2", - "name": "The Drummer Cydonia 24B v2", - "display_name": "The Drummer Cydonia 24B v2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 32768 - }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-17", - "last_updated": "2025-02-17", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v4", - "name": "The Drummer Cydonia 24B v4", - "display_name": "The Drummer Cydonia 24B v4", + "id": "z-ai/glm-4.5v", + "name": "GLM 4.5V", + "display_name": "GLM 4.5V", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 32768 + "context": 64000, + "output": 96000 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v4.3", - "name": "The Drummer Cydonia 24B v4.3", - "display_name": "The Drummer Cydonia 24B v4.3", + "id": "z-ai/glm-5-turbo", + "name": "GLM 5 Turbo", + "display_name": "GLM 5 Turbo", "modalities": { "input": [ "text" @@ -41295,50 +42536,57 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 202800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2025-12-25", - "last_updated": "2025-12-25", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "TheDrummer/Skyfall-31B-v4.2", - "name": "TheDrummer Skyfall 31B v4.2", - "display_name": "TheDrummer Skyfall 31B v4.2", + "id": "z-ai/glm-5v-turbo", + "name": "GLM 5V Turbo", + "display_name": "GLM 5V Turbo", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 202800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-26", - "last_updated": "2026-03-26", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "TheDrummer/Anubis-70B-v1", - "name": "Anubis 70B v1", - "display_name": "Anubis 70B v1", + "id": "z-ai/glm-4.6:thinking", + "name": "GLM 4.6 Thinking", + "display_name": "GLM 4.6 Thinking", "modalities": { "input": [ "text" @@ -41348,102 +42596,125 @@ ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 200000, + "output": 65535 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "TheDrummer/skyfall-36b-v2", - "name": "TheDrummer Skyfall 36B V2", - "display_name": "TheDrummer Skyfall 36B V2", + "id": "z-ai/glm-5v-turbo:thinking", + "name": "GLM 5V Turbo Thinking", + "display_name": "GLM 5V Turbo Thinking", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 32768 + "context": 202800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "TheDrummer/Anubis-70B-v1.1", - "name": "Anubis 70B v1.1", - "display_name": "Anubis 70B v1.1", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 256000, + "output": 65536 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "TheDrummer/Rocinante-12B-v1.1", - "name": "Rocinante 12b", - "display_name": "Rocinante 12b", + "id": "moonshotai/kimi-k2.6:thinking", + "name": "Kimi K2.6 Thinking", + "display_name": "Kimi K2.6 Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 256000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "TheDrummer/Magidonia-24B-v4.3", - "name": "The Drummer Magidonia 24B v4.3", - "display_name": "The Drummer Magidonia 24B v4.3", + "id": "moonshotai/kimi-k2-instruct-0711", + "name": "Kimi K2 0711", + "display_name": "Kimi K2 0711", "modalities": { "input": [ "text" @@ -41453,76 +42724,92 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 128000, + "output": 8192 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-25", - "last_updated": "2025-12-25", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v4.1", - "name": "The Drummer Cydonia 24B v4.1", - "display_name": "The Drummer Cydonia 24B v4.1", + "id": "moonshotai/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code High-Speed", + "display_name": "Kimi K2.7 Code High-Speed", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 32768 + "context": 262144, + "output": 65536 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-08-19", - "last_updated": "2025-08-19", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "TheDrummer/UnslopNemo-12B-v4.1", - "name": "UnslopNemo 12b v4", - "display_name": "UnslopNemo 12b v4", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 256000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "Tongyi-Zhiwen/QwenLong-L1-32B", - "name": "QwenLong L1 32B", - "display_name": "QwenLong L1 32B", + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ "text" @@ -41532,23 +42819,23 @@ ] }, "limit": { - "context": 128000, - "output": 40960 + "context": 256000, + "output": 262144 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-25", - "last_updated": "2025-01-25", + "open_weights": true, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "stepfun/step-3.7-flash:thinking", - "name": "Step 3.7 Flash Thinking", - "display_name": "Step 3.7 Flash Thinking", + "id": "moonshotai/kimi-latest", + "name": "Kimi Latest", + "display_name": "Kimi Latest", "modalities": { "input": [ "text", @@ -41560,8 +42847,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 1048576 }, "tool_call": true, "reasoning": { @@ -41569,120 +42856,61 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29", - "type": "chat" - }, - { - "id": "anthracite-org/magnum-v2-72b", - "name": "Magnum V2 72B", - "display_name": "Magnum V2 72B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": true, + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "anthracite-org/magnum-v4-72b", - "name": "Magnum v4 72B", - "display_name": "Magnum v4 72B", - "modalities": { - "input": [ - "text", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", - "type": "chat" - } - ] - }, - "fastrouter": { - "id": "fastrouter", - "name": "FastRouter", - "display_name": "FastRouter", - "api": "https://go.fastrouter.ai/api/v1", - "doc": "https://fastrouter.ai/models", - "models": [ - { - "id": "google/veo3.1-fast", - "name": "Veo 3.1 Fast", - "display_name": "Veo 3.1 Fast", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -41693,38 +42921,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -41732,9 +42952,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -41742,111 +42962,126 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/veo3.1-lite", - "name": "Veo 3.1 Lite", - "display_name": "Veo 3.1 Lite", + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "display_name": "Kimi K2 Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, + "context": 256000, "output": 8192 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-07-01", "type": "chat" }, { - "id": "google/gemini-3-pro-image-preview", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "moonshotai/kimi-k2.5:thinking", + "name": "Kimi K2.5 Thinking", + "display_name": "Kimi K2.5 Thinking", "modalities": { "input": [ "text", "image" ], "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 65536 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", + "type": "chat" + }, + { + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT 5.1 Codex Mini", + "display_name": "GPT 5.1 Codex Mini", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20", - "type": "imageGeneration" + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-image-preview", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "openai/gpt-chat-latest", + "name": "GPT Chat Latest", + "display_name": "GPT Chat Latest", "modalities": { "input": [ "text", @@ -41854,16 +43089,14 @@ "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -41875,84 +43108,87 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26", - "type": "imageGeneration" + "release_date": "2026-05-03", + "last_updated": "2026-05-03", + "type": "chat" }, { - "id": "google/imagen-4.0-fast", - "name": "Imagen 4 Fast", - "display_name": "Imagen 4 Fast", + "id": "openai/gpt-4.1-mini", + "name": "GPT 4.1 Mini", + "display_name": "GPT 4.1 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "google/veo3.1", - "name": "Veo 3.1", - "display_name": "Veo 3.1", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "openai/gpt-5.6-sol", + "name": "GPT 5.6 Sol", + "display_name": "GPT 5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -41960,36 +43196,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "openai/o3-mini-high", + "name": "OpenAI o3-mini (High)", + "display_name": "OpenAI o3-mini (High)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -41999,57 +43249,74 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2024-01-01", + "last_updated": "2025-01-31", "type": "chat" }, { - "id": "google/imagen-4.0-ultra", - "name": "Imagen 4 Ultra", - "display_name": "Imagen 4 Ultra", + "id": "openai/gpt-5.1-2025-11-13", + "name": "GPT-5.1 (2025-11-13)", + "display_name": "GPT-5.1 (2025-11-13)", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1000000, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "imageGeneration" + "release_date": "2024-01-01", + "last_updated": "2025-11-13", + "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "openai/gpt-4.1-nano", + "name": "GPT 4.1 Nano", + "display_name": "GPT 4.1 Nano", "modalities": { "input": [ "text", @@ -42061,45 +43328,25 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen/qwen3-coder", - "name": "Qwen3 Coder", - "display_name": "Qwen3 Coder", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -42109,122 +43356,146 @@ ] }, "limit": { - "context": 262144, - "output": 66536 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "leonardo-ai/lucid-origin", - "name": "Lucid Origin", - "display_name": "Lucid Origin", + "id": "openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 4096, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "leonardo-ai/lucid-realism", - "name": "Lucid Realism", - "display_name": "Lucid Realism", + "id": "openai/o3-mini", + "name": "OpenAI o3-mini", + "display_name": "OpenAI o3-mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 4096, - "output": 8192 + "context": 200000, + "output": 100000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "bytedance/seedance-2", - "name": "Seedance 2", - "display_name": "Seedance 2", + "id": "openai/gpt-5.6-sol-pro", + "name": "GPT 5.6 Sol Pro", + "display_name": "GPT 5.6 Sol Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 4096, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "openai/gpt-5.5", + "name": "GPT 5.5", + "display_name": "GPT 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -42233,76 +43504,79 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/gpt-5", + "name": "GPT 5", + "display_name": "GPT 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -42311,53 +43585,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "wanx/wan-v2-6", - "name": "Wan 2.6", - "display_name": "Wan 2.6", + "id": "openai/o4-mini-deep-research", + "name": "OpenAI o4-mini Deep Research", + "display_name": "OpenAI o4-mini Deep Research", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, - "output": 8192 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-06-26", + "last_updated": "2024-06-26", "type": "chat" }, { - "id": "x-ai/grok-4", - "name": "Grok 4", - "display_name": "Grok 4", + "id": "openai/o4-mini-high", + "name": "OpenAI o4-mini high", + "display_name": "OpenAI o4-mini high", "modalities": { "input": [ "text" @@ -42367,10 +43666,9 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 200000, + "output": 100000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -42378,60 +43676,74 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "release_date": "2025-12-04", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "openai/o3-deep-research", + "name": "OpenAI o3 Deep Research", + "display_name": "OpenAI o3 Deep Research", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-05", + "release_date": "2024-06-26", + "last_updated": "2024-06-26", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "openai/gpt-5-codex", + "name": "GPT-5 Codex", + "display_name": "GPT-5 Codex", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -42439,9 +43751,9 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -42449,19 +43761,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "deepseek-ai/deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill Llama 70B", - "display_name": "DeepSeek R1 Distill Llama 70B", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5 Turbo", + "display_name": "GPT-3.5 Turbo", "modalities": { "input": [ "text" @@ -42471,31 +43800,25 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 16385, + "output": 4096 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-01-23", - "last_updated": "2025-01-23", + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-latest", + "name": "GPT Latest", + "display_name": "GPT Latest", "modalities": { "input": [ "text", @@ -42507,111 +43830,124 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-29", + "last_updated": "2026-03-29", + "type": "chat" + }, + { + "id": "openai/o1-preview", + "name": "OpenAI o1-preview", + "display_name": "OpenAI o1-preview", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 32768 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2024-01-01", + "last_updated": "2024-09-12", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "openai/gpt-4o-search-preview", + "name": "GPT-4o Search Preview", + "display_name": "GPT-4o Search Preview", "modalities": { "input": [ "text", - "image", - "pdf" + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-10", + "last_updated": "2024-05-13", + "type": "chat" + }, + { + "id": "openai/o3-pro-2025-06-10", + "name": "OpenAI o3-pro (2025-06-10)", + "display_name": "OpenAI o3-pro (2025-06-10)", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -42619,46 +43955,37 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 100000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2024-01-01", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-5.4", + "name": "GPT 5.4", + "display_name": "GPT 5.4", "modalities": { "input": [ "text", @@ -42670,7 +43997,7 @@ ] }, "limit": { - "context": 1000000, + "context": 922000, "output": 128000 }, "temperature": false, @@ -42684,90 +44011,80 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai/gpt-5.6-luna-pro", + "name": "GPT 5.6 Luna Pro", + "display_name": "GPT 5.6 Luna Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "openai/gpt-5.2-codex", + "name": "GPT 5.2 Codex", + "display_name": "GPT 5.2 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -42775,111 +44092,134 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-5.4-nano", + "name": "GPT 5.4 Nano", + "display_name": "GPT 5.4 Nano", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "chat" - }, - { - "id": "moonshotai/kimi-k2", - "name": "Kimi K2", - "display_name": "Kimi K2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-image-2", - "name": "GPT Image 2", - "display_name": "GPT Image 2", + "id": "openai/gpt-5-pro", + "name": "GPT 5 Pro", + "display_name": "GPT 5 Pro", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "imageGeneration" + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", + "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "openai/gpt-5.4-mini", + "name": "GPT 5.4 Mini", + "display_name": "GPT 5.4 Mini", "modalities": { "input": [ "text", @@ -42891,61 +44231,81 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-realtime-1.5", - "name": "GPT Realtime 1.5", - "display_name": "GPT Realtime 1.5", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "audio", - "image" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "openai/o1", + "name": "OpenAI o1", + "display_name": "OpenAI o1", "modalities": { "input": [ "text" @@ -42955,30 +44315,40 @@ ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai/gpt-5.6-luna", + "name": "GPT 5.6 Luna", + "display_name": "GPT 5.6 Luna", "modalities": { "input": [ "text", @@ -43006,10 +44376,12 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -43022,29 +44394,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "openai/o3-mini-low", + "name": "OpenAI o3-mini (Low)", + "display_name": "OpenAI o3-mini (Low)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -43057,13 +44427,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -43071,21 +44434,21 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-01-31", + "last_updated": "2025-01-31", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "openai/gpt-5.2", + "name": "GPT 5.2", + "display_name": "GPT 5.2", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -43126,18 +44489,19 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "openai/gpt-5.3-codex", + "name": "GPT 5.3 Codex", + "display_name": "GPT 5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -43151,16 +44515,15 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -43178,52 +44541,18 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", - "type": "chat" - }, - { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "openai/gpt-5-mini", + "name": "GPT 5 Mini", + "display_name": "GPT 5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -43234,7 +44563,7 @@ "output": 128000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -43246,10 +44575,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -43262,30 +44591,31 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "openai/o1-pro", + "name": "OpenAI o1 Pro", + "display_name": "OpenAI o1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -43297,13 +44627,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -43313,19 +44636,20 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2023-09", + "release_date": "2025-03-19", + "last_updated": "2025-03-19", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "openai/gpt-5.1", + "name": "GPT 5.1", + "display_name": "GPT 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -43335,20 +44659,20 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", "high" @@ -43364,47 +44688,45 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "openai/gpt-4-turbo-preview", + "name": "GPT-4 Turbo Preview", + "display_name": "GPT-4 Turbo Preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "sarvam/sarvam-30b", - "name": "Sarvam 30B", - "display_name": "Sarvam 30B", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -43412,131 +44734,119 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "sarvam/sarvam-105b", - "name": "Sarvam 105B", - "display_name": "Sarvam 105B", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-01", - "last_updated": "2025-09-01", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" - } - ] - }, - "nearai": { - "id": "nearai", - "name": "NEAR AI Cloud", - "display_name": "NEAR AI Cloud", - "api": "https://cloud-api.near.ai/v1", - "doc": "https://docs.near.ai/", - "models": [ + }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "openai/gpt-5.1-codex", + "name": "GPT 5.1 Codex", + "display_name": "GPT 5.1 Codex", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "openai/gpt-5-nano", + "name": "GPT 5 Nano", + "display_name": "GPT 5 Nano", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -43545,51 +44855,74 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "google/gemini-3-pro", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "openai/gpt-4o-mini-search-preview", + "name": "GPT-4o mini Search Preview", + "display_name": "GPT-4o mini Search Preview", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-10", + "last_updated": "2024-07-18", + "type": "chat" + }, + { + "id": "openai/o3", + "name": "OpenAI o3", + "display_name": "OpenAI o3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 100000 + }, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -43598,36 +44931,31 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "openai/gpt-5.6-terra", + "name": "GPT 5.6 Terra", + "display_name": "GPT 5.6 Terra", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -43635,10 +44963,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -43646,26 +44974,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "openai/gpt-5.6-terra-pro", + "name": "GPT 5.6 Terra Pro", + "display_name": "GPT 5.6 Terra Pro", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -43673,51 +45017,30 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "openai/gpt-4.1", + "name": "GPT 4.1", + "display_name": "GPT 4.1", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -43725,45 +45048,25 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "openai/o4-mini", + "name": "OpenAI o4-mini", + "display_name": "OpenAI o4-mini", "modalities": { "input": [ "text" @@ -43773,10 +45076,10 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -43784,152 +45087,190 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "zai-org/GLM-5.1-FP8", - "name": "GLM-5.1 FP8", - "display_name": "GLM-5.1 FP8", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT 5.1 Codex Max", + "display_name": "GPT 5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" + }, + { + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama 3.3 70b Instruct", + "display_name": "Llama 3.3 70b Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "black-forest-labs/FLUX.2-klein-4B", - "name": "FLUX.2 Klein 4B", - "display_name": "FLUX.2 Klein 4B", + "id": "meta-llama/llama-4-maverick", + "name": "Llama 4 Maverick", + "display_name": "Llama 4 Maverick", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "Qwen/Qwen3.5-122B-A10B", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "meta-llama/llama-4-scout", + "name": "Llama 4 Scout", + "display_name": "Llama 4 Scout", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 328000, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "Qwen/Qwen3-Reranker-0.6B", - "name": "Qwen3 Reranker 0.6B", - "display_name": "Qwen3 Reranker 0.6B", + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Llama 3.2 3b Instruct", + "display_name": "Llama 3.2 3b Instruct", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 1024 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-06-03", - "last_updated": "2025-06-03", - "type": "rerank" + "release_date": "2024-01-01", + "last_updated": "2024-09-25", + "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B-A3B Instruct 2507", - "display_name": "Qwen3 30B-A3B Instruct 2507", + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Llama 3.1 8b Instruct", + "display_name": "Llama 3.1 8b Instruct", "modalities": { "input": [ "text" @@ -43939,24 +45280,23 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B-FP8", - "name": "Qwen 3.6 35B A3B FP8", - "display_name": "Qwen 3.6 35B A3B FP8", + "id": "arcee-ai/trinity-large-thinking", + "name": "Trinity Large Thinking", + "display_name": "Trinity Large Thinking", "modalities": { "input": [ "text" @@ -43967,63 +45307,49 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 80000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen3-VL 30B-A3B Instruct", - "display_name": "Qwen3-VL 30B-A3B Instruct", + "id": "bytedance-seed/seed-2.0-lite", + "name": "ByteDance Seed 2.0 Lite", + "display_name": "ByteDance Seed 2.0 Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 262144, + "output": 131072 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "attachment": false, + "open_weights": false, + "release_date": "2026-03-10", + "last_updated": "2026-03-10", "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-0.6B", - "name": "Qwen3 Embedding 0.6B", - "display_name": "Qwen3 Embedding 0.6B", + "id": "TheDrummer/Cydonia-24B-v2", + "name": "The Drummer Cydonia 24B v2", + "display_name": "The Drummer Cydonia 24B v2", "modalities": { "input": [ "text" @@ -44033,198 +45359,104 @@ ] }, "limit": { - "context": 40960, - "output": 1024 + "context": 16384, + "output": 32768 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-03", - "last_updated": "2025-06-03", - "type": "embedding" + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "TheDrummer/Cydonia-24B-v4", + "name": "The Drummer Cydonia 24B v4", + "display_name": "The Drummer Cydonia 24B v4", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 16384, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "TheDrummer/Cydonia-24B-v4.3", + "name": "The Drummer Cydonia 24B v4.3", + "display_name": "The Drummer Cydonia 24B v4.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32768, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-25", + "last_updated": "2025-12-25", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "TheDrummer/Anubis-70B-v1", + "name": "Anubis 70B v1", + "display_name": "Anubis 70B v1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 65536, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "TheDrummer/skyfall-36b-v2", + "name": "TheDrummer Skyfall 36B V2", + "display_name": "TheDrummer Skyfall 36B V2", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -44232,163 +45464,101 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32000, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-03-10", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "TheDrummer/Anubis-70B-v1.1", + "name": "Anubis 70B v1.1", + "display_name": "Anubis 70B v1.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "TheDrummer/Rocinante-12B-v1.1", + "name": "Rocinante 12b", + "display_name": "Rocinante 12b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "TheDrummer/Magidonia-24B-v4.3", + "name": "The Drummer Magidonia 24B v4.3", + "display_name": "The Drummer Magidonia 24B v4.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, + "context": 32768, "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-25", + "last_updated": "2025-12-25", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "TheDrummer/Cydonia-24B-v4.1", + "name": "The Drummer Cydonia 24B v4.1", + "display_name": "The Drummer Cydonia 24B v4.1", "modalities": { "input": [ "text" @@ -44398,44 +45568,26 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 131072 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "release_date": "2025-08-19", + "last_updated": "2025-08-19", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "TheDrummer/UnslopNemo-12B-v4.1", + "name": "UnslopNemo 12b v4", + "display_name": "UnslopNemo 12b v4", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -44443,129 +45595,109 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", + "type": "chat" + }, + { + "id": "Tongyi-Zhiwen/QwenLong-L1-32B", + "name": "QwenLong L1 32B", + "display_name": "QwenLong L1 32B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 40960 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2024-01-01", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "stepfun/step-3.7-flash:thinking", + "name": "Step 3.7 Flash Thinking", + "display_name": "Step 3.7 Flash Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "openai/whisper-large-v3", - "name": "Whisper Large v3", - "display_name": "Whisper Large v3", + "id": "anthracite-org/magnum-v2-72b", + "name": "Magnum V2 72B", + "display_name": "Magnum V2 72B", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 448 + "context": 16384, + "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2023-11-06", - "last_updated": "2023-11-06", + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "display_name": "Magnum v4 72B", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -44573,163 +45705,125 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 16384, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-01-01", "type": "chat" - }, + } + ] + }, + "fastrouter": { + "id": "fastrouter", + "name": "FastRouter", + "display_name": "FastRouter", + "api": "https://go.fastrouter.ai/api/v1", + "doc": "https://fastrouter.ai/models", + "models": [ { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "google/veo3.1-fast", + "name": "Veo 3.1 Fast", + "display_name": "Veo 3.1 Fast", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { "context": 400000, - "output": 128000 + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -44739,187 +45833,254 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "google/veo3.1-lite", + "name": "Veo 3.1 Lite", + "display_name": "Veo 3.1 Lite", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { "context": 400000, - "output": 128000 + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", + "type": "chat" + }, + { + "id": "google/gemini-3-pro-image-preview", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 65536, + "output": 32768 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "type": "imageGeneration" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "google/gemini-3.1-flash-image-preview", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "imageGeneration" + }, + { + "id": "google/imagen-4.0-fast", + "name": "Imagen 4 Fast", + "display_name": "Imagen 4 Fast", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 480, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "google/veo3.1", + "name": "Veo 3.1", + "display_name": "Veo 3.1", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { "context": 400000, - "output": 128000 + "output": 8192 }, "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", + "type": "chat" + }, + { + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -44929,34 +46090,57 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "google/imagen-4.0-ultra", + "name": "Imagen 4 Ultra", + "display_name": "Imagen 4 Ultra", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 480, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "imageGeneration" + }, + { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", @@ -44968,10 +46152,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -44981,184 +46165,196 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "qwen/qwen3-coder", + "name": "Qwen3 Coder", + "display_name": "Qwen3 Coder", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 66536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", + "type": "chat" + }, + { + "id": "leonardo-ai/lucid-origin", + "name": "Lucid Origin", + "display_name": "Lucid Origin", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 4096, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "leonardo-ai/lucid-realism", + "name": "Lucid Realism", + "display_name": "Lucid Realism", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 4096, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" - } - ] - }, - "daoxe": { - "id": "daoxe", - "name": "DaoXE", - "display_name": "DaoXE", - "api": "https://daoxe.com/v1", - "doc": "https://daoxe.com/pricing", - "models": [ + }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "bytedance/seedance-2", + "name": "Seedance 2", + "display_name": "Seedance 2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 4096, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", + "type": "chat" + }, + { + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -45175,22 +46371,19 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -45198,49 +46391,96 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" + }, + { + "id": "wanx/wan-v2-6", + "name": "Wan 2.6", + "display_name": "Wan 2.6", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 400000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, + "open_weights": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" + }, + { + "id": "x-ai/grok-4", + "name": "Grok 4", + "display_name": "Grok 4", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-07", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "grok-4.3", + "id": "x-ai/grok-4.3", "name": "Grok 4.3", "display_name": "Grok 4.3", "modalities": { @@ -45275,9 +46515,9 @@ "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", @@ -45289,10 +46529,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -45300,36 +46540,53 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "deepseek-ai/deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "display_name": "DeepSeek R1 Distill Llama 70B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-01-23", + "last_updated": "2025-01-23", + "type": "chat" + }, + { + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -45341,10 +46598,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -45354,69 +46611,93 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ "text", @@ -45460,21 +46741,19 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45482,50 +46761,50 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "medium", + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" - } - ] - }, - "crof": { - "id": "crof", - "name": "CrofAI", - "display_name": "CrofAI", - "api": "https://crof.ai/v1", - "doc": "https://crof.ai/docs", - "models": [ + }, { - "id": "glm-5", + "id": "z-ai/glm-5", "name": "GLM-5", "display_name": "GLM-5", "modalities": { @@ -45537,8 +46816,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -45559,12 +46838,12 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "glm-5.1", + "id": "z-ai/glm-5.1", "name": "GLM-5.1", "display_name": "GLM-5.1", "modalities": { @@ -45576,8 +46855,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -45587,13 +46866,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, @@ -45603,20 +46876,22 @@ "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -45626,39 +46901,89 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "chat" + }, + { + "id": "moonshotai/kimi-k2", + "name": "Kimi K2", + "display_name": "Kimi K2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-10", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai/gpt-image-2", + "name": "GPT Image 2", + "display_name": "GPT Image 2", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "imageGeneration" + }, + { + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -45668,53 +46993,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "greg-1-mini", - "name": "Greg 1 Mini", - "display_name": "Greg 1 Mini", + "id": "openai/gpt-realtime-1.5", + "name": "GPT Realtime 1.5", + "display_name": "GPT Realtime 1.5", "modalities": { "input": [ - "text" + "text", + "audio", + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 229376, - "output": 229376 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -45724,8 +47046,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -45740,28 +47062,29 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -45770,38 +47093,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -45812,108 +47144,139 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-13", - "last_updated": "2026-03-13", + "open_weights": false, + "knowledge": "2024-10-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -45923,8 +47286,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -45934,139 +47297,202 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "greg-2-super", - "name": "Greg 2 Super", - "display_name": "Greg 2 Super", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 229376, - "output": 229376 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-06-14", - "last_updated": "2026-06-14", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "greg-rp", - "name": "Greg (Roleplay)", - "display_name": "Greg (Roleplay)", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 229376, - "output": 229376 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2024-10-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2024-10-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "greg-2-ultra", - "name": "Greg 2 Ultra", - "display_name": "Greg 2 Ultra", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 229376, - "output": 229376 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-06-14", - "last_updated": "2026-06-14", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "sarvam/sarvam-30b", + "name": "Sarvam 30B", + "display_name": "Sarvam 30B", "modalities": { "input": [ "text" @@ -46076,8 +47502,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -46085,28 +47511,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-18", + "last_updated": "2026-02-18", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "sarvam/sarvam-105b", + "name": "Sarvam 105B", + "display_name": "Sarvam 105B", "modalities": { "input": [ "text" @@ -46116,7 +47530,7 @@ ] }, "limit": { - "context": 204800, + "context": 131072, "output": 131072 }, "temperature": true, @@ -46125,33 +47539,40 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2025-09-01", + "last_updated": "2025-09-01", "type": "chat" - }, + } + ] + }, + "nearai": { + "id": "nearai", + "name": "NEAR AI Cloud", + "display_name": "NEAR AI Cloud", + "api": "https://cloud-api.near.ai/v1", + "doc": "https://docs.near.ai/", + "models": [ { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -46161,30 +47582,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "deepseek-v4-pro-lightning", - "name": "DeepSeek V4 Pro Lightning", - "display_name": "DeepSeek V4 Pro Lightning", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -46195,40 +47635,51 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "google/gemini-3-pro", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -46237,40 +47688,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "kimi-k3-eco", - "name": "Kimi K3 Eco", - "display_name": "Kimi K3 Eco", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -46278,40 +47737,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -46320,27 +47776,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" @@ -46348,42 +47817,47 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" @@ -46391,7 +47865,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -46401,40 +47875,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "kimi-k2.5-lightning", - "name": "Kimi K2.5 (Lightning)", - "display_name": "Kimi K2.5 (Lightning)", + "id": "zai-org/GLM-5.1-FP8", + "name": "GLM-5.1 FP8", + "display_name": "GLM-5.1 FP8", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 202752, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -46453,65 +47919,53 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "release_date": "2026-03-27", + "last_updated": "2026-03-27", "type": "chat" - } - ] - }, - "qvac": { - "id": "qvac", - "name": "QVAC", - "display_name": "QVAC", - "doc": "https://www.npmjs.com/package/@qvac/ai-sdk-provider", - "models": [ + }, { - "id": "gemma4-31b", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "black-forest-labs/FLUX.2-klein-4B", + "name": "FLUX.2 Klein 4B", + "display_name": "FLUX.2 Klein 4B", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -46532,14 +47986,14 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "Qwen/Qwen3-Reranker-0.6B", + "name": "Qwen3 Reranker 0.6B", + "display_name": "Qwen3 Reranker 0.6B", "modalities": { "input": [ "text" @@ -46549,77 +48003,54 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 40960, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "release_date": "2025-06-03", + "last_updated": "2025-06-03", + "type": "rerank" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B-A3B Instruct 2507", + "display_name": "Qwen3 30B-A3B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "Qwen/Qwen3.6-35B-A3B-FP8", + "name": "Qwen 3.6 35B A3B FP8", + "display_name": "Qwen 3.6 35B A3B FP8", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" @@ -46627,7 +48058,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -46648,52 +48079,42 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen3.5-4b", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3-VL 30B-A3B Instruct", + "display_name": "Qwen3-VL 30B-A3B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "qwen3.5-0.8b", - "name": "Qwen3.5 0.8B", - "display_name": "Qwen3.5 0.8B", + "id": "Qwen/Qwen3-Embedding-0.6B", + "name": "Qwen3 Embedding 0.6B", + "display_name": "Qwen3 Embedding 0.6B", "modalities": { "input": [ "text" @@ -46703,388 +48124,362 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 40960, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-11-01", - "last_updated": "2025-11-01", - "type": "chat" + "release_date": "2025-06-03", + "last_updated": "2025-06-03", + "type": "embedding" }, { - "id": "qwen3.5-2b", - "name": "Qwen3.5 2B", - "display_name": "Qwen3.5 2B", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-11-01", - "last_updated": "2025-11-01", - "type": "chat" - }, - { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - } - ] - }, - "abliteration-ai": { - "id": "abliteration-ai", - "name": "abliteration.ai", - "display_name": "abliteration.ai", - "api": "https://api.abliteration.ai/v1", - "doc": "https://docs.abliteration.ai/models", - "models": [ - { - "id": "abliterated-model-large", - "name": "Abliterated Model Large", - "display_name": "Abliterated Model Large", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 999990 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-25", - "last_updated": "2026-07-28", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "abliterated-model", - "name": "Abliterated Model", - "display_name": "Abliterated Model", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 150000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-01-06", - "last_updated": "2026-07-28", - "type": "chat" - } - ] - }, - "alibaba-coding-plan-cn": { - "id": "alibaba-coding-plan-cn", - "name": "Alibaba Coding Plan (China)", - "display_name": "Alibaba Coding Plan (China)", - "api": "https://coding.dashscope.aliyuncs.com/v1", - "doc": "https://help.aliyun.com/zh/model-studio/coding-plan", - "models": [ - { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -47094,10 +48489,10 @@ ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -47106,77 +48501,94 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "qwen3-max-2026-01-23", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 24576 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -47185,143 +48597,219 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "openai/whisper-large-v3", + "name": "Whisper Large v3", + "display_name": "Whisper Large v3", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 448, + "output": 448 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2023-11-06", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" - } - ] - }, - "llmgateway": { - "id": "llmgateway", - "name": "LLM Gateway", - "display_name": "LLM Gateway", - "api": "https://api.llmgateway.io/v1", - "doc": "https://llmgateway.io/docs", - "models": [ + }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ "text" @@ -47331,25 +48819,30 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -47379,7 +48872,8 @@ "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -47392,15 +48886,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "grok-4", - "name": "Grok 4", - "display_name": "Grok 4", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -47411,58 +48905,47 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", - "type": "chat" - }, - { - "id": "mistral-small-2506", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -47473,43 +48956,61 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-27", - "last_updated": "2026-07-27", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -47518,39 +49019,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -47558,61 +49070,59 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "qwen3-vl-plus", - "name": "Qwen3-VL Plus", - "display_name": "Qwen3-VL Plus", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "grok-4-5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", @@ -47623,21 +49133,45 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" - }, + } + ] + }, + "daoxe": { + "id": "daoxe", + "name": "DaoXE", + "display_name": "DaoXE", + "api": "https://daoxe.com/v1", + "doc": "https://daoxe.com/pricing", + "models": [ { "id": "claude-sonnet-4-6", "name": "Claude Sonnet 4.6", @@ -47698,92 +49232,121 @@ "type": "chat" }, { - "id": "grok-build-0-1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -47791,28 +49354,33 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -47826,8 +49394,9 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "low", "medium", "high", "xhigh" @@ -47843,59 +49412,82 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "seed-1-8-251228", - "name": "Seed 1.8 (251228)", - "display_name": "Seed 1.8 (251228)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -47908,15 +49500,14 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -47928,29 +49519,53 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -47958,48 +49573,48 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "llama-3.1-70b-instruct", - "name": "Llama 3.1 70B Instruct", - "display_name": "Llama 3.1 70B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 2048 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" - }, + } + ] + }, + "crof": { + "id": "crof", + "name": "CrofAI", + "display_name": "CrofAI", + "api": "https://crof.ai/v1", + "doc": "https://crof.ai/docs", + "models": [ { "id": "glm-5", "name": "GLM-5", @@ -48013,8 +49628,8 @@ ] }, "limit": { - "context": 203000, - "output": 131072 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -48040,23 +49655,20 @@ "type": "chat" }, { - "id": "muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32000 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -48066,34 +49678,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48104,39 +49718,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" @@ -48144,9 +49749,9 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -48165,80 +49770,55 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "greg-1-mini", + "name": "Greg 1 Mini", + "display_name": "Greg 1 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 229376, + "output": 229376 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 202752, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -48246,39 +49826,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -48286,7 +49850,7 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48294,102 +49858,153 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-22", - "last_updated": "2026-06-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "claude-3-opus", - "name": "Claude 3 Opus", - "display_name": "Claude 3 Opus", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2024-03-04", - "last_updated": "2024-03-04", + "open_weights": true, + "release_date": "2026-03-13", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "grok-4-20-beta-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "qwen2-5-vl-72b-instruct", - "name": "Qwen2.5-VL 72B Instruct", - "display_name": "Qwen2.5-VL 72B Instruct", + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -48399,8 +50014,8 @@ ] }, "limit": { - "context": 131000, - "output": 98304 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48408,17 +50023,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "greg-2-super", + "name": "Greg 2 Super", + "display_name": "Greg 2 Super", "modalities": { "input": [ "text" @@ -48428,72 +50054,35 @@ ] }, "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", - "type": "chat" - }, - { - "id": "qwen-omni-turbo", - "name": "Qwen-Omni Turbo", - "display_name": "Qwen-Omni Turbo", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 32768, - "output": 2048 + "context": 229376, + "output": 229376 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-19", - "last_updated": "2025-03-26", + "release_date": "2026-06-14", + "last_updated": "2026-06-14", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash (New)", + "display_name": "DeepSeek V4 Flash (New)", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48504,88 +50093,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "greg-rp", + "name": "Greg (Roleplay)", + "display_name": "Greg (Roleplay)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 229376, + "output": 229376 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -48595,36 +50148,29 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "llama-3-70b-instruct", - "name": "Llama 3 70B Instruct", - "display_name": "Llama 3 70B Instruct", + "id": "greg-2-ultra", + "name": "Greg 2 Ultra", + "display_name": "Greg 2 Ultra", "modalities": { "input": [ "text" @@ -48634,8 +50180,8 @@ ] }, "limit": { - "context": 8192, - "output": 8000 + "context": 229376, + "output": 229376 }, "temperature": true, "tool_call": false, @@ -48643,27 +50189,26 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-04-18", - "last_updated": "2024-04-18", + "open_weights": false, + "release_date": "2026-06-14", + "last_updated": "2026-06-14", "type": "chat" }, { - "id": "seed-1-6-250915", - "name": "Seed 1.6 (250915)", - "display_name": "Seed 1.6 (250915)", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -48671,31 +50216,39 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48708,45 +50261,50 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-4o-mini-transcribe", - "name": "GPT-4o Mini Transcribe", - "display_name": "GPT-4o Mini Transcribe", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking (2507)", - "display_name": "Qwen3 235B A22B Thinking (2507)", + "id": "deepseek-v4-pro-lightning", + "name": "DeepSeek V4 Pro Lightning", + "display_name": "DeepSeek V4 Pro Lightning", "modalities": { "input": [ "text" @@ -48756,8 +50314,8 @@ ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48778,78 +50336,62 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "kimi-k3-eco", + "name": "Kimi K3 Eco", + "display_name": "Kimi K3 Eco", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -48857,7 +50399,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": false, "tool_call": true, @@ -48868,53 +50410,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 384000 + "context": 1000000, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -48931,32 +50459,29 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -48973,28 +50498,31 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -49013,76 +50541,68 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "kimi-k2.5-lightning", + "name": "Kimi K2.5 (Lightning)", + "display_name": "Kimi K2.5 (Lightning)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-06", + "last_updated": "2026-02-06", "type": "chat" - }, - { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", - "modalities": { - "input": [ - "text", + } + ] + }, + "qvac": { + "id": "qvac", + "name": "QVAC", + "display_name": "QVAC", + "doc": "https://www.npmjs.com/package/@qvac/ai-sdk-provider", + "models": [ + { + "id": "gemma4-31b", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", + "modalities": { + "input": [ + "text", "image" ], "output": [ @@ -49090,47 +50610,61 @@ ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262000, + "context": 262144, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { @@ -49147,7 +50681,7 @@ }, "limit": { "context": 131072, - "output": 32766 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -49161,26 +50695,28 @@ } }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -49190,31 +50726,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -49233,45 +50777,16 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" - }, - { - "id": "glm-4.7-flashx", - "name": "GLM-4.7-FlashX", - "display_name": "GLM-4.7-FlashX", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "qwen3.5-4b", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ "text" @@ -49281,58 +50796,62 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "ministral-8b-2512", - "name": "Ministral 8B", - "display_name": "Ministral 8B", + "id": "qwen3.5-0.8b", + "name": "Qwen3.5 0.8B", + "display_name": "Qwen3.5 0.8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 32768, "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-thinking", - "name": "Qwen3-Next 80B-A3B (Thinking)", - "display_name": "Qwen3-Next 80B-A3B (Thinking)", + "id": "qwen3.5-2b", + "name": "Qwen3.5 2B", + "display_name": "Qwen3.5 2B", "modalities": { "input": [ "text" @@ -49342,14 +50861,13 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -49364,47 +50882,17 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "ministral-14b-2512", - "name": "Ministral 14B", - "display_name": "Ministral 14B", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 262144, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" - }, - { - "id": "ministral-3b-2512", - "name": "Ministral 3B", - "display_name": "Ministral 3B", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" @@ -49412,36 +50900,49 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "abliteration-ai": { + "id": "abliteration-ai", + "name": "abliteration.ai", + "display_name": "abliteration.ai", + "api": "https://api.abliteration.ai/v1", + "doc": "https://docs.abliteration.ai/models", + "models": [ { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "abliterated-model-large", + "name": "Abliterated Model Large", + "display_name": "Abliterated Model Large", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 999990 }, "temperature": true, "tool_call": true, @@ -49449,27 +50950,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": false, + "open_weights": false, + "release_date": "2026-07-25", + "last_updated": "2026-07-28", "type": "chat" }, { - "id": "gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat", - "display_name": "GPT-5.2 Chat", + "id": "abliterated-model", + "name": "Abliterated Model", + "display_name": "Abliterated Model", "modalities": { "input": [ "text", @@ -49480,39 +50970,49 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 150000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-01-06", + "last_updated": "2026-07-28", "type": "chat" - }, + } + ] + }, + "alibaba-coding-plan-cn": { + "id": "alibaba-coding-plan-cn", + "name": "Alibaba Coding Plan (China)", + "display_name": "Alibaba Coding Plan (China)", + "api": "https://coding.dashscope.aliyuncs.com/v1", + "doc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "models": [ { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -49520,46 +51020,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen-plus-latest", - "name": "Qwen Plus Latest", - "display_name": "Qwen Plus Latest", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 8192 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -49572,31 +51063,30 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-01-25", - "last_updated": "2025-01-25", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -49613,22 +51103,21 @@ ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -49636,7 +51125,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -49658,14 +51147,14 @@ "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "minimax-m2.1-lightning", - "name": "MiniMax M2.1 Lightning", - "display_name": "MiniMax M2.1 Lightning", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -49675,67 +51164,69 @@ ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "grok-4-20-beta-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "gemini-pro-latest", - "name": "Gemini Pro Latest", - "display_name": "Gemini Pro Latest", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -49743,16 +51234,28 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-27", - "last_updated": "2026-02-27", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "glm-4-32b-0414-128k", - "name": "GLM-4 32B (0414-128k)", - "display_name": "GLM-4 32B (0414-128k)", + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -49762,24 +51265,36 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-04", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -49789,37 +51304,49 @@ ] }, "limit": { - "context": 130000, - "output": 4096 + "context": 196608, + "output": 24576 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "seed-1-6-flash-250715", - "name": "Seed 1.6 Flash (250715)", - "display_name": "Seed 1.6 Flash (250715)", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -49827,57 +51354,67 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "sonar-pro", - "name": "Sonar Pro", - "display_name": "Sonar Pro", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "nemotron-3-nano-omni", - "name": "Nemotron 3 Nano Omni", - "display_name": "Nemotron 3 Nano Omni", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -49885,16 +51422,37 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "llmgateway": { + "id": "llmgateway", + "name": "LLM Gateway", + "display_name": "LLM Gateway", + "api": "https://api.llmgateway.io/v1", + "doc": "https://llmgateway.io/docs", + "models": [ { - "id": "llama-3.2-11b-instruct", - "name": "Llama 3.2 11B Instruct", - "display_name": "Llama 3.2 11B Instruct", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ "text" @@ -49904,55 +51462,55 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -49965,72 +51523,52 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "grok-4", + "name": "Grok 4", + "display_name": "Grok 4", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "mistral-small-2506", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -50045,17 +51583,17 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "llama-4-scout-17b-instruct", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", @@ -50066,37 +51604,41 @@ ] }, "limit": { - "context": 131072, - "output": 2048 + "context": 1000000, + "output": 1000000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "release_date": "2026-07-27", + "last_updated": "2026-07-27", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -50106,33 +51648,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50140,39 +51689,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "display_name": "Qwen3-VL Plus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -50180,12 +51714,13 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -50206,9 +51741,9 @@ "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "grok-4-5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -50219,8 +51754,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -50228,77 +51763,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "gpt-3.5-turbo", - "name": "GPT-3.5-turbo", - "display_name": "GPT-3.5-turbo", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16385, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -50310,7 +51784,7 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -50323,11 +51797,18 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -50335,50 +51816,52 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "minicpm-v-4.5", - "name": "MiniCPM-V 4.5", - "display_name": "MiniCPM-V 4.5", + "id": "grok-build-0-1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -50388,8 +51871,8 @@ ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -50399,30 +51882,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", - "type": "chat" + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -50430,41 +51922,31 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -50472,33 +51954,47 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "grok-4-3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "seed-1-8-251228", + "name": "Seed 1.8 (251228)", + "display_name": "Seed 1.8 (251228)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -50507,76 +52003,56 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": true, + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "gpt-5-chat-latest", - "name": "GPT-5 Chat (latest)", - "display_name": "GPT-5 Chat (latest)", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" - }, - { - "id": "gpt-4o-search-preview", - "name": "GPT-4o Search Preview", - "display_name": "GPT-4o Search Preview", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -50584,24 +52060,24 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", @@ -50613,59 +52089,35 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "llama-4-maverick-17b-instruct", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "llama-3.1-70b-instruct", + "name": "Llama 3.1 70B Instruct", + "display_name": "Llama 3.1 70B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 128000, "output": 2048 }, "temperature": true, @@ -50673,45 +52125,16 @@ "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "type": "chat" - }, - { - "id": "gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat (latest)", - "display_name": "GPT-5.3 Chat (latest)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "minimax-m2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -50721,7 +52144,7 @@ ] }, "limit": { - "context": 204800, + "context": 203000, "output": 131072 }, "temperature": true, @@ -50732,31 +52155,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast Reasoning", - "display_name": "Grok 4.1 Fast Reasoning", + "id": "muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1048576, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -50771,25 +52202,29 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3-235b-a22b-fp8", - "name": "Qwen3 235B A22B FP8", - "display_name": "Qwen3 235B A22B FP8", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -50797,49 +52232,42 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", - "type": "chat" - }, - { - "id": "glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131000, - "output": 98304 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "cosmos3-super-reasoner", - "name": "Cosmos 3 Super Reasoner", - "display_name": "Cosmos 3 Super Reasoner", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" @@ -50847,7 +52275,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -50855,16 +52283,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", @@ -50908,58 +52347,26 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "type": "chat" - }, - { - "id": "glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -50973,9 +52380,8 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "low", "medium", "high", "xhigh" @@ -50992,42 +52398,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" - }, - { - "id": "qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "glm-4.6v-flashx", - "name": "GLM-4.6V FlashX", - "display_name": "GLM-4.6V FlashX", + "id": "fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", @@ -51038,8 +52416,8 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -51049,14 +52427,14 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2026-06-22", + "last_updated": "2026-06-22", "type": "chat" }, { - "id": "qwen2-5-vl-32b-instruct", - "name": "Qwen2.5 VL 32B Instruct", - "display_name": "Qwen2.5 VL 32B Instruct", + "id": "claude-3-opus", + "name": "Claude 3 Opus", + "display_name": "Claude 3 Opus", "modalities": { "input": [ "text", @@ -51067,8 +52445,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -51076,15 +52454,15 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-15", - "last_updated": "2025-03-15", + "open_weights": false, + "release_date": "2024-03-04", + "last_updated": "2024-03-04", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "grok-4-20-beta-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", @@ -51096,53 +52474,24 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "qwen2-5-vl-72b-instruct", + "name": "Qwen2.5-VL 72B Instruct", + "display_name": "Qwen2.5-VL 72B Instruct", "modalities": { "input": [ "text", @@ -51153,76 +52502,54 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "gemma-3-27b", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 110000, - "output": 110000 + "context": 131000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct (2507)", - "display_name": "Qwen3 235B A22B Instruct (2507)", + "id": "qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ "text" @@ -51232,7 +52559,7 @@ ] }, "limit": { - "context": 262144, + "context": 32768, "output": 8192 }, "temperature": true, @@ -51241,56 +52568,62 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "qwen-omni-turbo", + "name": "Qwen-Omni Turbo", + "display_name": "Qwen-Omni Turbo", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01-19", + "last_updated": "2025-03-26", "type": "chat" }, { - "id": "qwen35-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -51299,28 +52632,50 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -51332,8 +52687,16 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", - "effort": "high", + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], "verbosity": "medium", "verbosity_options": [ "low", @@ -51345,15 +52708,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -51363,8 +52726,8 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -51384,43 +52747,15 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" - }, - { - "id": "codestral-2508", - "name": "Codestral", - "display_name": "Codestral", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "llama-3.1-nemotron-ultra-253b", - "name": "Llama 3.1 Nemotron Ultra 253B", - "display_name": "Llama 3.1 Nemotron Ultra 253B", + "id": "llama-3-70b-instruct", + "name": "Llama 3 70B Instruct", + "display_name": "Llama 3 70B Instruct", "modalities": { "input": [ "text" @@ -51430,8 +52765,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 8192, + "output": 8000 }, "temperature": true, "tool_call": false, @@ -51440,14 +52775,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-04-07", - "last_updated": "2025-04-07", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "seed-1-6-250915", + "name": "Seed 1.6 (250915)", + "display_name": "Seed 1.6 (250915)", "modalities": { "input": [ "text", @@ -51458,8 +52793,8 @@ ] }, "limit": { - "context": 163840, - "output": 16384 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -51467,21 +52802,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": true, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", @@ -51506,21 +52836,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, @@ -51531,62 +52847,48 @@ "type": "chat" }, { - "id": "qwen3-vl-flash", - "name": "Qwen3 VL Flash", - "display_name": "Qwen3 VL Flash", + "id": "gpt-4o-mini-transcribe", + "name": "GPT-4o Mini Transcribe", + "display_name": "GPT-4o Mini Transcribe", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32000 + "context": 16000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-10-09", - "last_updated": "2025-10-09", + "release_date": "2025-03-20", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking (2507)", + "display_name": "Qwen3 235B A22B Thinking (2507)", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -51605,31 +52907,31 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -51639,41 +52941,45 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -51681,10 +52987,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -51692,20 +52998,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -51715,8 +53042,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -51736,29 +53063,31 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -51775,17 +53104,170 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "chat" + }, + { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -51816,9 +53298,9 @@ "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -51828,7 +53310,7 @@ ] }, "limit": { - "context": 228700, + "context": 200000, "output": 131072 }, "temperature": true, @@ -51844,14 +53326,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -51861,8 +53344,8 @@ ] }, "limit": { - "context": 196608, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -51872,24 +53355,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "o1", - "name": "o1", - "display_name": "o1", + "id": "glm-4.7-flashx", + "name": "GLM-4.7-FlashX", + "display_name": "GLM-4.7-FlashX", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -51897,54 +53384,38 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -51952,38 +53423,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "ministral-8b-2512", + "name": "Ministral 8B", + "display_name": "Ministral 8B", "modalities": { "input": [ "text", @@ -51995,29 +53447,23 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "hermes-4-405b", - "name": "Hermes 4 405B", - "display_name": "Hermes 4 405B", + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "display_name": "Qwen3-Next 80B-A3B (Thinking)", "modalities": { "input": [ "text" @@ -52028,7 +53474,7 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -52036,43 +53482,56 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct", - "display_name": "Llama 3.2 3B Instruct", + "id": "ministral-14b-2512", + "name": "Ministral 14B", + "display_name": "Ministral 14B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2024-09-18", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "ministral-3b-2512", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ "text", @@ -52083,61 +53542,77 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat", + "display_name": "GPT-5.2 Chat", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, @@ -52145,50 +53620,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -52203,13 +53656,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -52217,69 +53663,56 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "qwen-plus-latest", + "name": "Qwen Plus Latest", + "display_name": "Qwen Plus Latest", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-01-25", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", @@ -52319,36 +53752,51 @@ "type": "chat" }, { - "id": "glm-4.5-airx", - "name": "GLM-4.5 AirX", - "display_name": "GLM-4.5 AirX", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "minimax-text-01", - "name": "MiniMax Text 01", - "display_name": "MiniMax Text 01", + "id": "minimax-m2.1-lightning", + "name": "MiniMax M2.1 Lightning", + "display_name": "MiniMax M2.1 Lightning", "modalities": { "input": [ "text" @@ -52358,7 +53806,7 @@ ] }, "limit": { - "context": 1000000, + "context": 196608, "output": 131072 }, "temperature": true, @@ -52369,48 +53817,48 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "kimi-k2", - "name": "Kimi K2", - "display_name": "Kimi K2", + "id": "grok-4-20-beta-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "gemini-pro-latest", + "name": "Gemini Pro Latest", + "display_name": "Gemini Pro Latest", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -52426,126 +53874,71 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-02-27", + "last_updated": "2026-02-27", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "glm-4-32b-0414-128k", + "name": "GLM-4 32B (0414-128k)", + "display_name": "GLM-4 32B (0414-128k)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 130000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "claude-haiku-4-5-free", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "seed-1-6-flash-250715", + "name": "Seed 1.6 Flash (250715)", + "display_name": "Seed 1.6 Flash (250715)", "modalities": { "input": [ "text", @@ -52556,77 +53949,58 @@ ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct (2507)", - "display_name": "Qwen3 30B A3B Instruct (2507)", + "id": "sonar-pro", + "name": "Sonar Pro", + "display_name": "Sonar Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, + "context": 200000, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "nemotron-3-nano-omni", + "name": "Nemotron 3 Nano Omni", + "display_name": "Nemotron 3 Nano Omni", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -52639,23 +54013,22 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "llama-3.2-11b-instruct", + "name": "Llama 3.2 11B Instruct", + "display_name": "Llama 3.2 11B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -52663,37 +54036,38 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "attachment": false, + "open_weights": true, + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -52702,31 +54076,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", - "audio", "video", + "audio", "pdf" ], "output": [ @@ -52747,14 +54131,14 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ @@ -52765,26 +54149,27 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast Non-Reasoning", - "display_name": "Grok 4.1 Fast Non-Reasoning", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -52793,14 +54178,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "auto", - "name": "Auto Route", - "display_name": "Auto Route", + "id": "llama-4-scout-17b-instruct", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ "text", @@ -52811,29 +54197,24 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -52846,9 +54227,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -52861,14 +54242,14 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -52886,16 +54267,16 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high" @@ -52912,42 +54293,53 @@ "attachment": true, "open_weights": false, "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "custom", - "name": "Custom Model", - "display_name": "Custom Model", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", @@ -52958,10 +54350,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -52969,48 +54361,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -53019,14 +54393,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", "modalities": { "input": [ "text" @@ -53036,37 +54411,77 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 16385, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", + "type": "chat" + }, + { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "gpt-4o-mini-search-preview", - "name": "GPT-4o Mini Search Preview", - "display_name": "GPT-4o Mini Search Preview", + "id": "minicpm-v-4.5", + "name": "MiniCPM-V 4.5", + "display_name": "MiniCPM-V 4.5", "modalities": { "input": [ "text", @@ -53077,133 +54492,97 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -53229,14 +54608,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "grok-4-3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -53248,94 +54628,55 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5-chat-latest", + "name": "GPT-5 Chat (latest)", + "display_name": "GPT-5 Chat (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "gpt-4o-search-preview", + "name": "GPT-4o Search Preview", + "display_name": "GPT-4o Search Preview", "modalities": { "input": [ "text", @@ -53346,31 +54687,24 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" }, { - "id": "nemotron-3-ultra-550b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -53380,25 +54714,78 @@ ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", + "type": "chat" + }, + { + "id": "llama-4-maverick-17b-instruct", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ "text", @@ -53409,25 +54796,24 @@ ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 1048576, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat (latest)", + "display_name": "GPT-5.3 Chat (latest)", "modalities": { "input": [ "text", @@ -53438,36 +54824,25 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "minimax-m2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ "text" @@ -53477,8 +54852,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -53488,37 +54863,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "glm-4.5-x", - "name": "GLM-4.5 X", - "display_name": "GLM-4.5 X", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -53526,27 +54895,33 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "nemotron-3-nano-30b", - "name": "Nemotron 3 Nano 30B", - "display_name": "Nemotron 3 Nano 30B", + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast Reasoning", + "display_name": "Grok 4.1 Fast Reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -53554,46 +54929,49 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "qwen3-235b-a22b-fp8", + "name": "Qwen3 235B A22B FP8", + "display_name": "Qwen3 235B A22B FP8", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 40960, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen-coder-plus", - "name": "Qwen Coder Plus", - "display_name": "Qwen Coder Plus", + "id": "glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -53603,24 +54981,26 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 131000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-09-18", - "last_updated": "2024-09-18", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "cosmos3-super-reasoner", + "name": "Cosmos 3 Super Reasoner", + "display_name": "Cosmos 3 Super Reasoner", "modalities": { "input": [ "text", @@ -53631,40 +55011,25 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "grok-4-20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -53676,30 +55041,47 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "kimi-k3-fast", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ "text", @@ -53711,10 +55093,10 @@ ] }, "limit": { - "context": 1040384, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -53722,14 +55104,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -53741,7 +55124,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -53752,20 +55135,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -53775,138 +55174,154 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "glm-4.6v-flashx", + "name": "GLM-4.6V FlashX", + "display_name": "GLM-4.6V FlashX", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "nemotron-3-super-120b", - "name": "Nemotron 3 Super 120B", - "display_name": "Nemotron 3 Super 120B", + "id": "qwen2-5-vl-32b-instruct", + "name": "Qwen2.5 VL 32B Instruct", + "display_name": "Qwen2.5 VL 32B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": true, + "release_date": "2025-03-15", + "last_updated": "2025-03-15", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -53916,34 +55331,35 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "seed-1-6-250615", - "name": "Seed 1.6 (250615)", - "display_name": "Seed 1.6 (250615)", + "id": "gemma-3-27b", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", "modalities": { "input": [ "text", @@ -53954,36 +55370,34 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 110000, + "output": 110000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-06-25", - "last_updated": "2025-06-25", + "open_weights": false, + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "qwen-max-latest", - "name": "Qwen Max Latest", - "display_name": "Qwen Max Latest", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct (2507)", + "display_name": "Qwen3 235B A22B Instruct (2507)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 262144, "output": 8192 }, "temperature": true, @@ -53991,47 +55405,49 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-01-25", - "last_updated": "2025-01-25", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "gpt-4o-transcribe", - "name": "GPT-4o Transcribe", - "display_name": "GPT-4o Transcribe", + "id": "qwen35-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", + "image", + "video", "audio" ], "output": [ @@ -54039,58 +55455,70 @@ ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "grok-4-20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "hermes-4-70b", - "name": "Hermes 4 70B", - "display_name": "Hermes 4 70B", + "id": "qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ "text" @@ -54100,8 +55528,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -54109,118 +55537,123 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "sonar-reasoning-pro", - "name": "Sonar Reasoning Pro", - "display_name": "Sonar Reasoning Pro", + "id": "codestral-2508", + "name": "Codestral", + "display_name": "Codestral", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "llama-3.1-nemotron-ultra-253b", + "name": "Llama 3.1 Nemotron Ultra 253B", + "display_name": "Llama 3.1 Nemotron Ultra 253B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "release_date": "2025-04-07", + "last_updated": "2025-04-07", "type": "chat" - } - ] - }, - "kenari": { - "id": "kenari", - "name": "Kenari", - "display_name": "Kenari", - "api": "https://kenari.id/v1", - "doc": "https://kenari.id/docs", - "models": [ + }, { - "id": "gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 272000, + "context": 163840, "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "imageGeneration" + "open_weights": true, + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "type": "chat" }, { - "id": "mimo-v2-5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" @@ -54228,7 +55661,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -54236,17 +55669,36 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "grok-4-5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "qwen3-vl-flash", + "name": "Qwen3 VL Flash", + "display_name": "Qwen3 VL Flash", "modalities": { "input": [ "text", @@ -54257,38 +55709,49 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2025-10-09", + "last_updated": "2025-10-09", "type": "chat" }, { - "id": "grok-build-0-1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -54296,62 +55759,95 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "nemotron-3-nano-30b-a3b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -54359,32 +55855,35 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -54393,40 +55892,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -54436,8 +55920,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -54458,72 +55942,48 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32766 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -54533,9 +55993,10 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 228700, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -54548,27 +56009,60 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "kimi-k2-7-code:free", - "name": "Kimi K2.7 Code (Free)", - "display_name": "Kimi K2.7 Code (Free)", + "id": "minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 196608, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "type": "chat" + }, + { + "id": "o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -54576,15 +56070,29 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "gpt-5-6-luna", + "id": "gpt-5.6-luna", "name": "GPT-5.6 Luna", "display_name": "GPT-5.6 Luna", "modalities": { @@ -54638,23 +56146,21 @@ "type": "chat" }, { - "id": "mimo-v2-5:free", - "name": "MiMo-V2.5 (Free)", - "display_name": "MiMo-V2.5 (Free)", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -54662,17 +56168,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "hermes-4-405b", + "name": "Hermes 4 405B", + "display_name": "Hermes 4 405B", "modalities": { "input": [ "text" @@ -54682,8 +56192,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -54691,102 +56201,108 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "llama-3.2-3b-instruct", + "name": "Llama 3.2 3B Instruct", + "display_name": "Llama 3.2 3B Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 128000 + "context": 32768, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2024-09-18", + "last_updated": "2024-09-18", "type": "chat" }, { - "id": "gemini-3-1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "kimi-k2-7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -54794,17 +56310,38 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "gpt-5-4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -54822,20 +56359,19 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -54848,29 +56384,83 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "type": "chat" + }, + { + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -54886,17 +56476,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepseek-v4-flash:free", - "name": "DeepSeek V4 Flash (Free)", - "display_name": "DeepSeek V4 Flash (Free)", + "id": "glm-4.5-airx", + "name": "GLM-4.5 AirX", + "display_name": "GLM-4.5 AirX", "modalities": { "input": [ "text" @@ -54906,26 +56496,24 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "minimax-text-01", + "name": "MiniMax Text 01", + "display_name": "MiniMax Text 01", "modalities": { "input": [ "text" @@ -54939,27 +56527,54 @@ "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" }, { - "id": "gemini-2-5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "kimi-k2", + "name": "Kimi K2", + "display_name": "Kimi K2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-11", + "last_updated": "2025-07-11", + "type": "chat" + }, + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "audio", "video", + "audio", "pdf" ], "output": [ @@ -54976,17 +56591,34 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen3-7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", @@ -54999,7 +56631,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -55007,50 +56639,57 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "gpt-5-6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -55063,52 +56702,96 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "claude-haiku-4-5-free", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "type": "chat" + }, + { + "id": "qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct (2507)", + "display_name": "Qwen3 30B A3B Instruct (2507)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -55116,29 +56799,53 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", + "type": "chat" + }, + { + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -55148,8 +56855,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -55159,23 +56866,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "gpt-5-6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -55183,10 +56899,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -55196,59 +56912,87 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "glm-4-7-flash:free", - "name": "GLM-4.7-Flash (Free)", - "display_name": "GLM-4.7-Flash (Free)", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast Non-Reasoning", + "display_name": "Grok 4.1 Fast Non-Reasoning", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 2000000, + "output": 2000000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", + "type": "chat" + }, + { + "id": "auto", + "name": "Auto Route", + "display_name": "Auto Route", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { @@ -55287,21 +57031,20 @@ "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -55315,111 +57058,72 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", - "type": "chat" - }, - { - "id": "glm-5-1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-2-5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "custom", + "name": "Custom Model", + "display_name": "Custom Model", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -55430,23 +57134,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b:free", - "name": "Nemotron 3 Super 120B A12B (Free)", - "display_name": "Nemotron 3 Super 120B A12B (Free)", + "id": "qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -55454,37 +57175,34 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2025-10-02", + "last_updated": "2025-10-02", "type": "chat" }, { - "id": "kimi-k2-6:free", - "name": "Kimi K2.6 (Free)", - "display_name": "Kimi K2.6 (Free)", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -55492,46 +57210,56 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "mimo-v2-5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "gpt-4o-mini-search-preview", + "name": "GPT-4o Mini Search Preview", + "display_name": "GPT-4o Mini Search Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" }, { - "id": "gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -55543,90 +57271,104 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" - } - ] - }, - "friendli": { - "id": "friendli", - "name": "Friendli", - "display_name": "Friendli", - "api": "https://api.friendli.ai/serverless/v1", - "doc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", - "models": [ + }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -55636,7 +57378,7 @@ ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -55647,38 +57389,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -55687,92 +57425,117 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-29", - "last_updated": "2026-01-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 1000000, + "output": 1000000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "nemotron-3-ultra-550b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -55782,8 +57545,8 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 1048576, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -55791,36 +57554,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" - } - ] - }, - "opencode": { - "id": "opencode", - "name": "OpenCode Zen", - "display_name": "OpenCode Zen", - "api": "https://opencode.ai/zen/v1", - "doc": "https://opencode.ai/docs/zen", - "models": [ + }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex Mini", - "display_name": "GPT-5.1 Codex Mini", + "id": "mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", @@ -55831,149 +57574,78 @@ ] }, "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", - "type": "chat" - }, - { - "id": "trinity-large-preview-free", - "name": "Trinity Large Preview", - "display_name": "Trinity Large Preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-01-28", - "last_updated": "2026-01-28", + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "qwen3-vl-235b-a22b-thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "open_weights": true, + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -55981,20 +57653,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "hy3-preview-free", - "name": "Hy3 preview Free", - "display_name": "Hy3 preview Free", + "id": "glm-4.5-x", + "name": "GLM-4.5 X", + "display_name": "GLM-4.5 X", "modalities": { "input": [ "text" @@ -56004,8 +57682,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -56013,22 +57691,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "nemotron-3-nano-30b", + "name": "Nemotron 3 Nano 30B", + "display_name": "Nemotron 3 Nano 30B", "modalities": { "input": [ "text" @@ -56038,8 +57710,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -56047,34 +57719,20 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "open_weights": false, + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -56082,45 +57740,25 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.3-codex-spark", - "name": "GPT-5.3 Codex Spark", - "display_name": "GPT-5.3 Codex Spark", + "id": "qwen-coder-plus", + "name": "Qwen Coder Plus", + "display_name": "Qwen Coder Plus", "modalities": { "input": [ "text" @@ -56130,52 +57768,28 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2024-09-18", + "last_updated": "2024-09-18", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -56183,46 +57797,39 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "grok-4-20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", @@ -56234,10 +57841,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -56245,35 +57852,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "kimi-k3-fast", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -56285,37 +57876,25 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1040384, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -56327,7 +57906,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -56338,38 +57917,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -56379,8 +57940,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -56388,79 +57949,55 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "minimax-m3-free", - "name": "MiniMax-M3 Free", - "display_name": "MiniMax-M3 Free", + "id": "nemotron-3-super-120b", + "name": "Nemotron 3 Super 120B", + "display_name": "Nemotron 3 Super 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -56468,33 +58005,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-05-31", - "last_updated": "2026-05-31", + "open_weights": false, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "glm-4.7-free", - "name": "GLM-4.7 Free", - "display_name": "GLM-4.7 Free", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -56513,17 +58046,17 @@ ] } }, - "attachment": false, - "open_weights": true, + "attachment": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "claude-opus-4-1-20250805", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ "text", @@ -56535,8 +58068,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -56548,18 +58081,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -56567,129 +58093,79 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "seed-1-6-250615", + "name": "Seed 1.6 (250615)", + "display_name": "Seed 1.6 (250615)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2025-06-25", + "last_updated": "2025-06-25", "type": "chat" }, { - "id": "gemini-3.1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "qwen-max-latest", + "name": "Qwen Max Latest", + "display_name": "Qwen Max Latest", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-01-25", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -56699,79 +58175,87 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gpt-4o-transcribe", + "name": "GPT-4o Transcribe", + "display_name": "GPT-4o Transcribe", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16000, + "output": 16000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-03-20", + "last_updated": "2025-03-20", + "type": "chat" + }, + { + "id": "grok-4-20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "hermes-4-70b", + "name": "Hermes 4 70B", + "display_name": "Hermes 4 70B", "modalities": { "input": [ "text" @@ -56781,7 +58265,7 @@ ] }, "limit": { - "context": 204800, + "context": 131072, "output": 131072 }, "temperature": true, @@ -56790,129 +58274,117 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "display_name": "Sonar Reasoning Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "north-mini-code-free", - "name": "North Mini Code Free", - "display_name": "North Mini Code Free", + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09-23", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" + } + ] + }, + "kenari": { + "id": "kenari", + "name": "Kenari", + "display_name": "Kenari", + "api": "https://kenari.id/v1", + "doc": "https://kenari.id/docs", + "models": [ + { + "id": "gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 272000, + "output": 16384 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "imageGeneration" }, { - "id": "qwen3.6-plus-free", - "name": "Qwen3.6 Plus Free", - "display_name": "Qwen3.6 Plus Free", + "id": "mimo-v2-5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -56920,8 +58392,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -56929,39 +58401,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "grok-4-5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -56969,38 +58431,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "ling-3.0-flash-free", - "name": "Ling-3.0-flash Free", - "display_name": "Ling-3.0-flash Free", + "id": "grok-build-0-1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -57008,21 +58461,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "laguna-s-2.1-free", - "name": "Laguna S 2.1 Free", - "display_name": "Laguna S 2.1 Free", + "id": "nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ "text" @@ -57032,8 +58480,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -57048,25 +58496,27 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "deepseek-v4-flash-free", - "name": "DeepSeek V4 Flash Free (New)", - "display_name": "DeepSeek V4 Flash Free (New)", + "id": "kimi-k2-6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -57074,34 +58524,21 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gemini-3-flash", - "name": "Gemini 3 Flash", - "display_name": "Gemini 3 Flash", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -57109,10 +58546,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57122,45 +58559,50 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -57179,63 +58621,111 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-5-free", - "name": "GLM-5 Free", - "display_name": "GLM-5 Free", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "chat" + }, + { + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mimo-v2-omni-free", - "name": "MiMo V2 Omni Free", - "display_name": "MiMo V2 Omni Free", + "id": "kimi-k2-7-code:free", + "name": "Kimi K2.7 Code (Free)", + "display_name": "Kimi K2.7 Code (Free)", "modalities": { "input": [ "text", "image", - "audio", - "pdf" + "video" ], "output": [ "text" @@ -57243,36 +58733,25 @@ }, "limit": { "context": 262144, - "output": 64000 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gpt-5-6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -57300,10 +58779,12 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -57316,61 +58797,74 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "mimo-v2-5:free", + "name": "MiMo-V2.5 (Free)", + "display_name": "MiMo-V2.5 (Free)", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { @@ -57399,13 +58893,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, @@ -57415,94 +58903,73 @@ "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "gemini-3-1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "minimax-m2.5-free", - "name": "MiniMax-M2.5 Free", - "display_name": "MiniMax-M2.5 Free", + "id": "kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5 Codex", - "display_name": "GPT-5 Codex", + "id": "gpt-5-4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -57520,19 +58987,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -57545,20 +59013,18 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -57566,46 +59032,36 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax-m2.1-free", - "name": "MiniMax-M2.1 Free", - "display_name": "MiniMax-M2.1 Free", + "id": "deepseek-v4-flash:free", + "name": "DeepSeek V4 Flash (Free)", + "display_name": "DeepSeek V4 Flash (Free)", "modalities": { "input": [ "text" @@ -57615,8 +59071,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -57624,22 +59080,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -57650,7 +59101,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -57658,34 +59109,22 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gemini-3-pro", - "name": "Gemini 3 Pro", - "display_name": "Gemini 3 Pro", + "id": "gemini-2-5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", "image", - "video", "audio", + "video", "pdf" ], "output": [ @@ -57702,45 +59141,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "qwen3-7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -57748,35 +59172,32 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, + "attachment": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "mimo-v2-flash-free", - "name": "MiMo V2 Flash Free", - "display_name": "MiMo V2 Flash Free", + "id": "gpt-5-6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57785,25 +59206,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-12-16", - "last_updated": "2025-12-16", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "grok-code", - "name": "Grok Code Fast 1", - "display_name": "Grok Code Fast 1", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -57813,8 +59246,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -57822,84 +59255,68 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-20", - "last_updated": "2025-08-20", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -57907,36 +59324,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "gpt-5-6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -57948,27 +59348,28 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -57981,30 +59382,26 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "glm-4-7-flash:free", + "name": "GLM-4.7-Flash (Free)", + "display_name": "GLM-4.7-Flash (Free)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -58012,49 +59409,32 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "hy3-free", - "name": "Hy3 Free", - "display_name": "Hy3 Free", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 190000, - "output": 64000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -58065,62 +59445,107 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-26", - "last_updated": "2026-06-26", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "kimi-k2.5-free", - "name": "Kimi K2.5 Free", - "display_name": "Kimi K2.5 Free", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "glm-5-1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "gemini-2-5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -58128,47 +59553,26 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -58180,48 +59584,31 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "nemotron-3-super-120b-a12b:free", + "name": "Nemotron 3 Super 120B A12B (Free)", + "display_name": "Nemotron 3 Super 120B A12B (Free)", "modalities": { "input": [ "text" @@ -58231,8 +59618,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -58240,28 +59627,47 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "kimi-k2-6:free", + "name": "Kimi K2.6 (Free)", + "display_name": "Kimi K2.6 (Free)", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "chat" + }, + { + "id": "mimo-v2-5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ "text" @@ -58271,7 +59677,7 @@ ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -58280,28 +59686,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -58329,12 +59724,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -58347,29 +59740,36 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - }, + } + ] + }, + "friendli": { + "id": "friendli", + "name": "Friendli", + "display_name": "Friendli", + "api": "https://api.friendli.ai/serverless/v1", + "doc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "models": [ { - "id": "mimo-v2.5-free", - "name": "MiMo V2.5 Free", - "display_name": "MiMo V2.5 Free", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -58379,93 +59779,71 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 202752, + "output": 202752 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -58474,47 +59852,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -58522,36 +59888,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-29", + "last_updated": "2026-01-29", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 196608, + "output": 196608 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -58568,17 +59928,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "kimi-k2", - "name": "Kimi K2", - "display_name": "Kimi K2", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ "text" @@ -58588,25 +59947,45 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" - }, + } + ] + }, + "opencode": { + "id": "opencode", + "name": "OpenCode Zen", + "display_name": "OpenCode Zen", + "api": "https://opencode.ai/zen/v1", + "doc": "https://opencode.ai/docs/zen", + "models": [ { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "display_name": "GPT-5.1 Codex Mini", "modalities": { "input": [ "text", @@ -58655,9 +60034,9 @@ "type": "chat" }, { - "id": "big-pickle", - "name": "Big Pickle", - "display_name": "Big Pickle", + "id": "trinity-large-preview-free", + "name": "Trinity Large Preview", + "display_name": "Trinity Large Preview", "modalities": { "input": [ "text" @@ -58667,90 +60046,99 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-17", - "last_updated": "2025-10-17", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-01-28", + "last_updated": "2026-01-28", "type": "chat" }, { - "id": "nemotron-3-super-free", - "name": "Nemotron 3 Super Free", - "display_name": "Nemotron 3 Super Free", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 128000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-02", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -58758,30 +60146,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "hy3-preview-free", + "name": "Hy3 preview Free", + "display_name": "Hy3 preview Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -58789,7 +60170,7 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -58802,31 +60183,30 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-20", - "last_updated": "2026-05-20", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -58843,78 +60223,79 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-04", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "gpt-5.3-codex-spark", + "name": "GPT-5.3 Codex Spark", + "display_name": "GPT-5.3 Codex Spark", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, "temperature": false, @@ -58930,10 +60311,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -58944,17 +60325,17 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-3-5-haiku", - "name": "Claude Haiku 3.5", - "display_name": "Claude Haiku 3.5", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -58967,24 +60348,46 @@ }, "limit": { "context": 200000, - "output": 8192 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-07-31", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -58996,63 +60399,59 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ - "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -59071,17 +60470,17 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -59133,71 +60532,55 @@ "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -59205,10 +60588,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59221,26 +60604,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "nemotron-3-ultra-free", - "name": "Nemotron 3 Ultra Free", - "display_name": "Nemotron 3 Ultra Free", + "id": "minimax-m3-free", + "name": "MiniMax-M3 Free", + "display_name": "MiniMax-M3 Free", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -59250,41 +60635,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2026-02", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2025-01", + "release_date": "2026-05-31", + "last_updated": "2026-05-31", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "glm-4.7-free", + "name": "GLM-4.7 Free", + "display_name": "GLM-4.7 Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59292,34 +60669,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59329,74 +60713,112 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen3-coder", - "name": "Qwen3 Coder", - "display_name": "Qwen3 Coder", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "gemini-3.1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -59408,25 +60830,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "ring-2.6-1t-free", - "name": "Ring 2.6 1T Free", - "display_name": "Ring 2.6 1T Free", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash (New)", + "display_name": "DeepSeek V4 Flash (New)", "modalities": { "input": [ "text" @@ -59436,8 +60864,8 @@ ] }, "limit": { - "context": 262000, - "output": 66000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -59458,26 +60886,28 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-05-08", - "last_updated": "2026-05-08", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "mimo-v2-pro-free", - "name": "MiMo V2 Pro Free", - "display_name": "MiMo V2 Pro Free", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -59498,15 +60928,15 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "ling-2.6-flash-free", - "name": "Ling 2.6 Flash Free", - "display_name": "Ling 2.6 Flash Free", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -59516,38 +60946,42 @@ ] }, "limit": { - "context": 262100, - "output": 32800 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2025-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" - } - ] - }, - "sakana": { - "id": "sakana", - "name": "Sakana AI", - "display_name": "Sakana AI", - "api": "https://api.sakana.ai/v1", - "doc": "https://console.sakana.ai/models", - "models": [ + }, { - "id": "fugu-ultra-20260615", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -59555,57 +60989,94 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "north-mini-code-free", + "name": "North Mini Code Free", + "display_name": "North Mini Code Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09-23", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "fugu", - "name": "Fugu", - "display_name": "Fugu", + "id": "longcat-2.0-free", + "name": "LongCat-2.0 Free", + "display_name": "LongCat-2.0 Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -59613,46 +61084,48 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" - } - ] - }, - "trustedrouter": { - "id": "trustedrouter", - "name": "TrustedRouter", - "display_name": "TrustedRouter", - "api": "https://api.trustedrouter.com/v1", - "doc": "https://trustedrouter.com/docs", - "models": [ + }, { - "id": "synth", - "name": "Synth", - "display_name": "Synth", + "id": "qwen3.6-plus-free", + "name": "Qwen3.6 Plus Free", + "display_name": "Qwen3.6 Plus Free", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -59660,21 +61133,31 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-06-20", - "last_updated": "2026-06-27", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "zdr", - "name": "Zero Data Retention", - "display_name": "Zero Data Retention", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -59690,29 +61173,38 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-27", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "e2e", - "name": "End-to-End Encrypted", - "display_name": "End-to-End Encrypted", + "id": "ling-3.0-flash-free", + "name": "Ling-3.0-flash Free", + "display_name": "Ling-3.0-flash Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -59720,29 +61212,32 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-27", + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "auto", - "name": "Auto", - "display_name": "Auto", + "id": "laguna-s-2.1-free", + "name": "Laguna S 2.1 Free", + "display_name": "Laguna S 2.1 Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -59755,29 +61250,27 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-06-27", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "cheap", - "name": "Cheap", - "display_name": "Cheap", + "id": "deepseek-v4-flash-free", + "name": "DeepSeek V4 Flash Free (New)", + "display_name": "DeepSeek V4 Flash Free (New)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -59785,20 +61278,34 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-06-27", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "synth-code", - "name": "Synth Code", - "display_name": "Synth Code", + "id": "gemini-3-flash", + "name": "Gemini 3 Flash", + "display_name": "Gemini 3 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -59806,8 +61313,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -59815,29 +61322,49 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-06-20", - "last_updated": "2026-06-27", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "fast", - "name": "Fast", - "display_name": "Fast", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -59845,199 +61372,307 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-27", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" - } - ] - }, - "atomic-chat": { - "id": "atomic-chat", - "name": "Atomic Chat", - "display_name": "Atomic Chat", - "api": "http://127.0.0.1:1337/v1", - "doc": "https://atomic.chat", - "models": [ + }, { - "id": "Qwen3_5-9B-Q4_K_M", - "name": "Qwen 3.5 9B (Q4_K_M)", - "display_name": "Qwen 3.5 9B (Q4_K_M)", + "id": "glm-5-free", + "name": "GLM-5 Free", + "display_name": "GLM-5 Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-03-05", - "last_updated": "2026-04-04", + "knowledge": "2025-04", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "gemma-4-E4B-it-IQ4_XS", - "name": "Gemma 4 E4B Instruct (IQ4_XS)", - "display_name": "Gemma 4 E4B Instruct (IQ4_XS)", + "id": "mimo-v2-omni-free", + "name": "MiMo V2 Omni Free", + "display_name": "MiMo V2 Omni Free", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "Qwen3_5-9B-MLX-4bit", - "name": "Qwen 3.5 9B (MLX 4-bit)", - "display_name": "Qwen 3.5 9B (MLX 4-bit)", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-05", - "last_updated": "2026-04-04", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gemma-4-E4B-it-MLX-4bit", - "name": "Gemma 4 E4B Instruct (MLX 4-bit)", - "display_name": "Gemma 4 E4B Instruct (MLX 4-bit)", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 200000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "Meta-Llama-3_1-8B-Instruct-GGUF", - "name": "Meta Llama 3.1 8B Instruct (GGUF)", - "display_name": "Meta Llama 3.1 8B Instruct (GGUF)", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 512000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" - } - ] - }, - "inception": { - "id": "inception", - "name": "Inception", - "display_name": "Inception", - "api": "https://api.inceptionlabs.ai/v1/", - "doc": "https://platform.inceptionlabs.ai/docs", - "models": [ + }, { - "id": "mercury-edit-2", - "name": "Mercury Edit 2", - "display_name": "Mercury Edit 2", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-03-30", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", + "id": "minimax-m2.5-free", + "name": "MiniMax-M2.5 Free", + "display_name": "MiniMax-M2.5 Free", "modalities": { "input": [ "text" @@ -60047,8 +61682,8 @@ ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -60056,39 +61691,36 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01-01", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" - } - ] - }, - "stepfun-step-plan": { - "id": "stepfun-step-plan", - "name": "StepFun Step Plan (China)", - "display_name": "StepFun Step Plan (China)", - "api": "https://api.stepfun.com/step_plan/v1", - "doc": "https://platform.stepfun.com/docs/zh/step-plan/integrations/reasoning-api", - "models": [ + }, { - "id": "step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "gpt-5-codex", + "name": "GPT-5 Codex", + "display_name": "GPT-5 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -60097,67 +61729,121 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "type": "chat" + }, + { + "id": "minimax-m2.1-free", + "name": "MiniMax-M2.1 Free", + "display_name": "MiniMax-M2.1 Free", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "knowledge": "2025-01", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -60167,8 +61853,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -60189,119 +61875,30 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "step-router-v1", - "name": "Step Router v1", - "display_name": "Step Router v1", + "id": "gemini-3-pro", + "name": "Gemini 3 Pro", + "display_name": "Gemini 3 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", - "type": "chat" - } - ] - }, - "modelscope": { - "id": "modelscope", - "name": "ModelScope", - "display_name": "ModelScope", - "api": "https://api-inference.modelscope.cn/v1", - "doc": "https://modelscope.cn/docs/model-service/API-Inference/intro", - "models": [ - { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-07-21", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -60312,25 +61909,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -60340,25 +61943,31 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3-235B-A22B-Thinking-2507", - "display_name": "Qwen3-235B-A22B-Thinking-2507", + "id": "mimo-v2-flash-free", + "name": "MiMo V2 Flash Free", + "display_name": "MiMo V2 Flash Free", "modalities": { "input": [ "text" @@ -60369,7 +61978,7 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -60390,15 +61999,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "knowledge": "2024-12", + "release_date": "2025-12-16", + "last_updated": "2025-12-16", "type": "chat" }, { - "id": "ZhipuAI/GLM-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "grok-code", + "name": "Grok Code Fast 1", + "display_name": "Grok Code Fast 1", "modalities": { "input": [ "text" @@ -60408,8 +62017,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -60417,66 +62026,20 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-20", + "last_updated": "2025-08-20", "type": "chat" }, { - "id": "ZhipuAI/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 202752, - "output": 98304 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", - "type": "chat" - } - ] - }, - "github-copilot": { - "id": "github-copilot", - "name": "GitHub Copilot", - "display_name": "GitHub Copilot", - "api": "https://api.githubcopilot.com", - "doc": "https://docs.github.com/en/copilot", - "models": [ - { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -60484,45 +62047,48 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -60534,54 +62100,47 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -60593,28 +62152,27 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -60627,19 +62185,21 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -60647,10 +62207,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -60660,39 +62220,32 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "mai-code-1-flash-picker", - "name": "MAI-Code-1-Flash", - "display_name": "MAI-Code-1-Flash", + "id": "hy3-free", + "name": "Hy3 Free", + "display_name": "Hy3 Free", "modalities": { "input": [ "text" @@ -60702,8 +62255,8 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 190000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -60711,17 +62264,63 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": false, - "knowledge": "2025-12", - "release_date": "2026-06-02", - "last_updated": "2026-06-08", + "open_weights": true, + "release_date": "2026-06-26", + "last_updated": "2026-06-26", "type": "chat" }, { - "id": "claude-opus-4.5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "kimi-k2.5-free", + "name": "Kimi K2.5 Free", + "display_name": "Kimi K2.5 Free", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "type": "chat" + }, + { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ "text", @@ -60733,8 +62332,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -60746,17 +62345,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -60764,22 +62357,22 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", @@ -60791,22 +62384,23 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", @@ -60823,30 +62417,26 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -60857,33 +62447,65 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "type": "chat" + }, + { + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -60895,57 +62517,55 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "mimo-v2.5-free", + "name": "MiMo V2.5 Free", + "display_name": "MiMo V2.5 Free", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" @@ -60959,52 +62579,41 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -61038,14 +62647,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -61090,14 +62699,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -61108,100 +62717,100 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Claude Sonnet 4 (latest)", - "display_name": "Claude Sonnet 4 (latest)", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 216000, - "output": 16000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "kimi-k2", + "name": "Kimi K2", + "display_name": "Kimi K2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "type": "chat" + }, + { + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -61231,8 +62840,7 @@ "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -61245,30 +62853,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "big-pickle", + "name": "Big Pickle", + "display_name": "Big Pickle", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -61277,146 +62883,184 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2025-10-17", + "last_updated": "2025-10-17", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "nemotron-3-super-free", + "name": "Nemotron 3 Super Free", + "display_name": "Nemotron 3 Super Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 204800, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2026-02", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", + "type": "chat" + }, + { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "type": "chat" + }, + { + "id": "grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-05-20", + "last_updated": "2026-05-20", "type": "chat" }, { - "id": "claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -61430,19 +63074,19 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -61455,15 +63099,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -61474,8 +63118,8 @@ ] }, "limit": { - "context": 264000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -61512,50 +63156,43 @@ "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-3-5-haiku", + "name": "Claude Haiku 3.5", + "display_name": "Claude Haiku 3.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 200000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" + "open_weights": false, + "knowledge": "2024-07-31", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -61564,57 +63201,62 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "medium", + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -61625,33 +63267,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -61663,52 +63297,49 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -61720,43 +63351,47 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { @@ -61796,33 +63431,43 @@ "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "nemotron-3-ultra-free", + "name": "Nemotron 3 Ultra Free", + "display_name": "Nemotron 3 Ultra Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2026-02", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { @@ -61841,7 +63486,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": false, "tool_call": true, @@ -61862,24 +63507,23 @@ "type": "chat" }, { - "id": "claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -61889,50 +63533,34 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" - } - ] - }, - "302ai": { - "id": "302ai", - "name": "302.AI", - "display_name": "302.AI", - "api": "https://api.302.ai/v1", - "doc": "https://doc.302.ai", - "models": [ + }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "qwen3-coder-480b-a35b-instruct", - "display_name": "qwen3-coder-480b-a35b-instruct", + "id": "qwen3-coder", + "name": "Qwen3 Coder", + "display_name": "Qwen3 Coder", "modalities": { "input": [ "text" @@ -61951,28 +63579,29 @@ "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", "release_date": "2025-07-23", "last_updated": "2025-07-23", "type": "chat" }, { - "id": "grok-4.20-beta-0309-reasoning", - "name": "grok-4.20-beta-0309-reasoning", - "display_name": "grok-4.20-beta-0309-reasoning", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -61982,91 +63611,77 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "claude-sonnet-4-6", - "display_name": "claude-sonnet-4-6", + "id": "ring-2.6-1t-free", + "name": "Ring 2.6 1T Free", + "display_name": "Ring 2.6 1T Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262000, + "output": 66000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-18", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-05-08", + "last_updated": "2026-05-08", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "mimo-v2-pro-free", + "name": "MiMo V2 Pro Free", + "display_name": "MiMo V2 Pro Free", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -62074,168 +63689,123 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "gpt-4.1-mini", - "display_name": "gpt-4.1-mini", + "id": "ling-2.6-flash-free", + "name": "Ling 2.6 Flash Free", + "display_name": "Ling 2.6 Flash Free", "modalities": { "input": [ - "text", - "image", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" - }, - { - "id": "gpt-4o", - "name": "gpt-4o", - "display_name": "gpt-4o", - "modalities": { - "input": [ - "text", - "image", - "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262100, + "output": 32800 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" - }, + } + ] + }, + "sakana": { + "id": "sakana", + "name": "Sakana AI", + "display_name": "Sakana AI", + "api": "https://api.sakana.ai/v1", + "doc": "https://console.sakana.ai/models", + "models": [ { - "id": "glm-5", - "name": "glm-5", - "display_name": "glm-5", + "id": "fugu-ultra-20260615", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "claude-haiku-4-5", - "display_name": "claude-haiku-4-5", + "id": "fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-16", - "last_updated": "2025-10-16", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "gpt-5.4-pro", - "display_name": "gpt-5.4-pro", + "id": "fugu", + "name": "Fugu", + "display_name": "Fugu", "modalities": { "input": [ "text", @@ -62246,8 +63816,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, "temperature": false, "tool_call": true, @@ -62255,49 +63825,38 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" - }, + } + ] + }, + "trustedrouter": { + "id": "trustedrouter", + "name": "TrustedRouter", + "display_name": "TrustedRouter", + "api": "https://api.trustedrouter.com/v1", + "doc": "https://trustedrouter.com/docs", + "models": [ { - "id": "grok-4-fast-reasoning", - "name": "grok-4-fast-reasoning", - "display_name": "grok-4-fast-reasoning", + "id": "synth", + "name": "Synth", + "display_name": "Synth", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -62305,72 +63864,59 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-06-20", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3-30B-A3B", - "display_name": "Qwen3-30B-A3B", + "id": "zdr", + "name": "Zero Data Retention", + "display_name": "Zero Data Retention", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "release_date": "2026-06-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "glm-4.5-air", - "name": "glm-4.5-air", - "display_name": "glm-4.5-air", + "id": "e2e", + "name": "End-to-End Encrypted", + "display_name": "End-to-End Encrypted", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -62378,21 +63924,21 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "gemini-2.5-flash", - "display_name": "gemini-2.5-flash", + "id": "auto", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -62400,7 +63946,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -62410,45 +63956,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-05-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "glm-5.1", - "name": "glm-5.1", - "display_name": "glm-5.1", + "id": "cheap", + "name": "Cheap", + "display_name": "Cheap", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -62457,55 +63989,46 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-10", - "last_updated": "2026-04-10", + "release_date": "2026-05-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "doubao-seed-1-6-vision-250815", - "name": "doubao-seed-1-6-vision-250815", - "display_name": "doubao-seed-1-6-vision-250815", + "id": "synth-code", + "name": "Synth Code", + "display_name": "Synth Code", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-06-20", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "claude-opus-4-6", - "display_name": "claude-opus-4-6", + "id": "fast", + "name": "Fast", + "display_name": "Fast", "modalities": { "input": [ "text", @@ -62518,53 +64041,33 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-06", - "last_updated": "2026-03-13", + "release_date": "2026-06-01", + "last_updated": "2026-06-27", "type": "chat" - }, + } + ] + }, + "atomic-chat": { + "id": "atomic-chat", + "name": "Atomic Chat", + "display_name": "Atomic Chat", + "api": "http://127.0.0.1:1337/v1", + "doc": "https://atomic.chat", + "models": [ { - "id": "gpt-4.1-nano", - "name": "gpt-4.1-nano", - "display_name": "gpt-4.1-nano", + "id": "Qwen3_5-9B-Q4_K_M", + "name": "Qwen 3.5 9B (Q4_K_M)", + "display_name": "Qwen 3.5 9B (Q4_K_M)", "modalities": { "input": [ "text", @@ -62575,8 +64078,8 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -62584,16 +64087,15 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-03-05", + "last_updated": "2026-04-04", "type": "chat" }, { - "id": "kimi-k2-thinking-turbo", - "name": "kimi-k2-thinking-turbo", - "display_name": "kimi-k2-thinking-turbo", + "id": "gemma-4-E4B-it-IQ4_XS", + "name": "Gemma 4 E4B Instruct (IQ4_XS)", + "display_name": "Gemma 4 E4B Instruct (IQ4_XS)", "modalities": { "input": [ "text" @@ -62603,26 +64105,24 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "claude-opus-4-1-20250805-thinking", - "name": "claude-opus-4-1-20250805-thinking", - "display_name": "claude-opus-4-1-20250805-thinking", + "id": "Qwen3_5-9B-MLX-4bit", + "name": "Qwen 3.5 9B (MLX 4-bit)", + "display_name": "Qwen 3.5 9B (MLX 4-bit)", "modalities": { "input": [ "text", @@ -62633,76 +64133,51 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-05-27", - "last_updated": "2025-05-27", + "open_weights": true, + "release_date": "2026-03-05", + "last_updated": "2026-04-04", "type": "chat" }, { - "id": "chatgpt-4o-latest", - "name": "chatgpt-4o-latest", - "display_name": "chatgpt-4o-latest", + "id": "gemma-4-E4B-it-MLX-4bit", + "name": "Gemma 4 E4B Instruct (MLX 4-bit)", + "display_name": "Gemma 4 E4B Instruct (MLX 4-bit)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-08", - "last_updated": "2024-08-08", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "glm-4.7-flashx", - "name": "glm-4.7-flashx", - "display_name": "glm-4.7-flashx", + "id": "Meta-Llama-3_1-8B-Instruct-GGUF", + "name": "Meta Llama 3.1 8B Instruct (GGUF)", + "display_name": "Meta Llama 3.1 8B Instruct (GGUF)", "modalities": { "input": [ "text" @@ -62712,38 +64187,44 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-20", - "last_updated": "2026-01-20", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" - }, + } + ] + }, + "inception": { + "id": "inception", + "name": "Inception", + "display_name": "Inception", + "api": "https://api.inceptionlabs.ai/v1/", + "doc": "https://platform.inceptionlabs.ai/docs", + "models": [ { - "id": "gemini-3-pro-image-preview", - "name": "gemini-3-pro-image-preview", - "display_name": "gemini-3-pro-image-preview", + "id": "mercury-edit-2", + "name": "Mercury Edit 2", + "display_name": "Mercury Edit 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -62751,38 +64232,19 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-20", - "last_updated": "2025-11-20", - "type": "imageGeneration" + "release_date": "2026-03-30", + "last_updated": "2026-03-30", + "type": "chat" }, { - "id": "ministral-14b-2512", - "name": "ministral-14b-2512", - "display_name": "ministral-14b-2512", + "id": "mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -62790,24 +64252,34 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-12-16", - "last_updated": "2025-12-16", + "knowledge": "2025-01-01", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" - }, + } + ] + }, + "stepfun-step-plan": { + "id": "stepfun-step-plan", + "name": "StepFun Step Plan (China)", + "display_name": "StepFun Step Plan (China)", + "api": "https://api.stepfun.com/step_plan/v1", + "doc": "https://platform.stepfun.com/docs/zh/step-plan/integrations/reasoning-api", + "models": [ { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ "text" @@ -62817,100 +64289,90 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-26", - "last_updated": "2025-10-26", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "gpt-5.2-chat-latest", - "name": "gpt-5.2-chat-latest", - "display_name": "gpt-5.2-chat-latest", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-12", - "last_updated": "2025-12-12", - "type": "chat" - }, - { - "id": "grok-4.1", - "name": "grok-4.1", - "display_name": "grok-4.1", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "gemini-2.5-flash-nothink", - "name": "gemini-2.5-flash-nothink", - "display_name": "gemini-2.5-flash-nothink", + "id": "step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -62921,34 +64383,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-06-24", - "last_updated": "2025-06-24", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "MiniMax-M1", - "name": "MiniMax-M1", - "display_name": "MiniMax-M1", + "id": "step-router-v1", + "name": "Step Router v1", + "display_name": "Step Router v1", "modalities": { "input": [ "text" @@ -62958,8 +64411,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -62968,14 +64421,24 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-06-16", - "last_updated": "2025-06-16", + "knowledge": "2025-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" - }, + } + ] + }, + "modelscope": { + "id": "modelscope", + "name": "ModelScope", + "display_name": "ModelScope", + "api": "https://api-inference.modelscope.cn/v1", + "doc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "models": [ { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -62985,106 +64448,64 @@ ] }, "limit": { - "context": 204800, + "context": 262144, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "claude-opus-4-6-thinking", - "name": "claude-opus-4-6-thinking", - "display_name": "claude-opus-4-6-thinking", + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2026-02-06", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "gemini-3-flash-preview", - "display_name": "gemini-3-flash-preview", + "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -63095,33 +64516,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "deepseek-v3.2-thinking", - "name": "DeepSeek-V3.2-Thinking", - "display_name": "DeepSeek-V3.2-Thinking", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ "text" @@ -63131,40 +64544,38 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "gpt-5", - "name": "gpt-5", - "display_name": "gpt-5", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3-235B-A22B-Thinking-2507", + "display_name": "Qwen3-235B-A22B-Thinking-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -63173,35 +64584,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "qwen3-235b-a22b", - "name": "Qwen3-235B-A22B", - "display_name": "Qwen3-235B-A22B", + "id": "ZhipuAI/GLM-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -63211,36 +64612,26 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "ZhipuAI/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -63250,13 +64641,14 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 202752, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -63264,51 +64656,77 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-19", - "last_updated": "2025-12-19", + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" - }, + } + ] + }, + "github-copilot": { + "id": "github-copilot", + "name": "GitHub Copilot", + "display_name": "GitHub Copilot", + "api": "https://api.githubcopilot.com", + "doc": "https://docs.github.com/en/copilot", + "models": [ { - "id": "gemini-3.1-flash-image-preview", - "name": "gemini-3.1-flash-image-preview", - "display_name": "gemini-3.1-flash-image-preview", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-02-27", - "last_updated": "2026-02-27", - "type": "imageGeneration" + "release_date": "2026-05-19", + "last_updated": "2026-05-19", + "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "claude-sonnet-4-5", - "display_name": "claude-sonnet-4-5", + "id": "claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -63321,7 +64739,7 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -63333,11 +64751,18 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -63345,36 +64770,37 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "grok-4.20-multi-agent-beta-0309", - "name": "grok-4.20-multi-agent-beta-0309", - "display_name": "grok-4.20-multi-agent-beta-0309", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -63382,48 +64808,95 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "grok-4-fast-non-reasoning", - "name": "grok-4-fast-non-reasoning", - "display_name": "grok-4-fast-non-reasoning", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "glm-4.6", - "name": "glm-4.6", - "display_name": "glm-4.6", + "id": "mai-code-1-flash-picker", + "name": "MAI-Code-1-Flash", + "display_name": "MAI-Code-1-Flash", "modalities": { "input": [ "text" @@ -63433,8 +64906,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -63442,72 +64915,75 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "open_weights": false, + "knowledge": "2025-12", + "release_date": "2026-06-02", + "last_updated": "2026-06-08", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "gemini-2.5-flash-preview-09-2025", - "display_name": "gemini-2.5-flash-preview-09-2025", + "id": "claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", + "default_enabled": false, + "mode": "mixed", "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, + "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-5.4", - "name": "gpt-5.4", - "display_name": "gpt-5.4", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -63526,16 +65002,15 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -63552,107 +65027,72 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "grok-4-1-fast-reasoning", - "display_name": "grok-4-1-fast-reasoning", + "id": "claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 200000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-20", - "last_updated": "2025-11-20", - "type": "chat" - }, - { - "id": "glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 98304 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-29", - "last_updated": "2025-07-29", - "type": "chat" - }, - { - "id": "qwen3-max-2025-09-23", - "name": "qwen3-max-2025-09-23", - "display_name": "qwen3-max-2025-09-23", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 258048, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-24", - "last_updated": "2025-09-24", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "claude-sonnet-4-5-20250929", - "display_name": "claude-sonnet-4-5-20250929", + "id": "claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -63665,7 +65105,7 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -63697,73 +65137,67 @@ "attachment": true, "open_weights": false, "knowledge": "2025-07-31", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-12", - "last_updated": "2025-08-12", - "type": "chat" - }, - { - "id": "kimi-k2-0905-preview", - "name": "kimi-k2-0905-preview", - "display_name": "kimi-k2-0905-preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "claude-opus-4-5-20251101", - "display_name": "claude-opus-4-5-20251101", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -63775,53 +65209,47 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-25", - "last_updated": "2025-11-25", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { "id": "gpt-5.4-nano", - "name": "gpt-5.4-nano", - "display_name": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -63866,42 +65294,64 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "qwen3-235b-a22b-instruct-2507", - "display_name": "qwen3-235b-a22b-instruct-2507", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "claude-3-5-haiku-latest", - "name": "claude-3-5-haiku-latest", - "display_name": "claude-3-5-haiku-latest", + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4 (latest)", + "display_name": "Claude Sonnet 4 (latest)", "modalities": { "input": [ "text", @@ -63913,25 +65363,47 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 216000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-07-31", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "gpt-5-pro", - "display_name": "gpt-5-pro", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -63943,20 +65415,27 @@ }, "limit": { "context": 400000, - "output": 272000 + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], "verbosity": "medium", "verbosity_options": [ "low", @@ -63968,143 +65447,225 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-08", - "last_updated": "2025-10-08", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen-flash", - "name": "Qwen-Flash", - "display_name": "Qwen-Flash", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "deepseek-v3.2", - "display_name": "deepseek-v3.2", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "doubao-seed-1-6-thinking-250715", - "name": "doubao-seed-1-6-thinking-250715", - "display_name": "doubao-seed-1-6-thinking-250715", + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "glm-for-coding", - "name": "glm-for-coding", - "display_name": "glm-for-coding", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "gpt-5.4-mini", - "display_name": "gpt-5.4-mini", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -64115,27 +65676,26 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 264000, + "output": 64000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -64148,28 +65708,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929-thinking", - "name": "claude-sonnet-4-5-20250929-thinking", - "display_name": "claude-sonnet-4-5-20250929-thinking", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 500000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -64179,39 +65738,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen-Plus", - "display_name": "Qwen-Plus", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 256000, + "output": 32000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", + "type": "chat" + }, + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -64219,106 +65800,132 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "glm-4.7", - "name": "glm-4.7", - "display_name": "glm-4.7", + "id": "claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "gpt-5.2", - "name": "gpt-5.2", - "display_name": "gpt-5.2", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -64331,44 +65938,51 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-12", - "last_updated": "2025-12-12", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "gemini-2.5-flash-image", - "display_name": "gemini-2.5-flash-image", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-08", - "last_updated": "2025-10-08", - "type": "imageGeneration" + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "claude-3-5-haiku-20241022", - "name": "claude-3-5-haiku-20241022", - "display_name": "claude-3-5-haiku-20241022", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -64380,8 +65994,8 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -64390,27 +66004,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-07-31", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "gpt-5-mini", - "display_name": "gpt-5-mini", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, "temperature": false, "tool_call": true, @@ -64420,36 +66035,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "claude-haiku-4-5-20251001", - "display_name": "claude-haiku-4-5-20251001", + "id": "claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -64462,7 +66061,7 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -64474,11 +66073,18 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -64486,22 +66092,31 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-16", - "last_updated": "2025-10-16", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" - }, + } + ] + }, + "302ai": { + "id": "302ai", + "name": "302.AI", + "display_name": "302.AI", + "api": "https://api.302.ai/v1", + "doc": "https://doc.302.ai", + "models": [ { - "id": "deepseek-chat", - "name": "Deepseek-Chat", - "display_name": "Deepseek-Chat", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "qwen3-coder-480b-a35b-instruct", + "display_name": "qwen3-coder-480b-a35b-instruct", "modalities": { "input": [ "text" @@ -64511,8 +66126,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -64521,15 +66136,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-11-29", - "last_updated": "2024-11-29", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "doubao-seed-1-8-251215", - "name": "doubao-seed-1-8-251215", - "display_name": "doubao-seed-1-8-251215", + "id": "grok-4.20-beta-0309-reasoning", + "name": "grok-4.20-beta-0309-reasoning", + "display_name": "grok-4.20-beta-0309-reasoning", "modalities": { "input": [ "text", @@ -64540,28 +66155,35 @@ ] }, "limit": { - "context": 224000, - "output": 64000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "gemini-2.5-flash-lite-preview-09-2025", - "display_name": "gemini-2.5-flash-lite-preview-09-2025", + "id": "claude-sonnet-4-6", + "name": "claude-sonnet-4-6", + "display_name": "claude-sonnet-4-6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -64569,7 +66191,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -64581,35 +66203,107 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, + "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "knowledge": "2025-08-31", + "release_date": "2026-02-18", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-4.5-airx", - "name": "glm-4.5-airx", - "display_name": "glm-4.5-airx", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "type": "chat" + }, + { + "id": "gpt-4.1-mini", + "name": "gpt-4.1-mini", + "display_name": "gpt-4.1-mini", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "gpt-4o", + "name": "gpt-4o", + "display_name": "gpt-4o", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" @@ -64624,29 +66318,28 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "claude-opus-4-5-20251101-thinking", - "name": "claude-opus-4-5-20251101-thinking", - "display_name": "claude-opus-4-5-20251101-thinking", + "id": "glm-5", + "name": "glm-5", + "display_name": "glm-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -64657,55 +66350,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-11-25", - "last_updated": "2025-11-25", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5.1", - "name": "gpt-5.1", - "display_name": "gpt-5.1", + "id": "claude-haiku-4-5", + "name": "claude-haiku-4-5", + "display_name": "claude-haiku-4-5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -64715,34 +66392,34 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "knowledge": "2025-02-28", + "release_date": "2025-10-16", + "last_updated": "2025-10-16", "type": "chat" }, { - "id": "gpt-5.4-nano-2026-03-17", - "name": "gpt-5.4-nano-2026-03-17", - "display_name": "gpt-5.4-nano-2026-03-17", + "id": "gpt-5.4-pro", + "name": "gpt-5.4-pro", + "display_name": "gpt-5.4-pro", "modalities": { "input": [ "text", @@ -64753,24 +66430,22 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", - "low", "medium", "high", "xhigh" @@ -64787,25 +66462,26 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "kimi-k2-thinking", - "display_name": "kimi-k2-thinking", + "id": "grok-4-fast-reasoning", + "name": "grok-4-fast-reasoning", + "display_name": "grok-4-fast-reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -64815,26 +66491,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-06", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "qwen3-30b-a3b", + "name": "Qwen3-30B-A3B", + "display_name": "Qwen3-30B-A3B", "modalities": { "input": [ "text" @@ -64844,8 +66514,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -64865,26 +66535,26 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "knowledge": "2025-04", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "gemini-2.5-pro", - "display_name": "gemini-2.5-pro", + "id": "glm-4.5-air", + "name": "glm-4.5-air", + "display_name": "glm-4.5-air", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -64892,65 +66562,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "grok-4-1-fast-non-reasoning", - "name": "grok-4-1-fast-non-reasoning", - "display_name": "grok-4-1-fast-non-reasoning", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2000000, - "output": 30000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-20", - "last_updated": "2025-11-20", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "gemini-3-pro-preview", - "display_name": "gemini-3-pro-preview", + "id": "gemini-2.5-flash", + "name": "gemini-2.5-flash", + "display_name": "gemini-2.5-flash", "modalities": { "input": [ "text", @@ -64962,7 +66584,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -64974,12 +66596,15 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ @@ -64989,15 +66614,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "glm-5-turbo", - "display_name": "glm-5-turbo", + "id": "glm-5.1", + "name": "glm-5.1", + "display_name": "glm-5.1", "modalities": { "input": [ "text" @@ -65029,57 +66654,42 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-04-10", + "last_updated": "2026-04-10", "type": "chat" }, { - "id": "glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "doubao-seed-1-6-vision-250815", + "name": "doubao-seed-1-6-vision-250815", + "display_name": "doubao-seed-1-6-vision-250815", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "claude-opus-4-7", - "display_name": "claude-opus-4-7", + "id": "claude-opus-4-6", + "name": "claude-opus-4-6", + "display_name": "claude-opus-4-6", "modalities": { "input": [ "text", @@ -65104,125 +66714,103 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-06", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-sonnet-4-20250514", - "name": "claude-sonnet-4-20250514", - "display_name": "claude-sonnet-4-20250514", + "id": "gpt-4.1-nano", + "name": "gpt-4.1-nano", + "display_name": "gpt-4.1-nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gemini-2.0-flash-lite", - "name": "gemini-2.0-flash-lite", - "display_name": "gemini-2.0-flash-lite", + "id": "kimi-k2-thinking-turbo", + "name": "kimi-k2-thinking-turbo", + "display_name": "kimi-k2-thinking-turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-11", - "release_date": "2025-06-16", - "last_updated": "2025-06-16", + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "claude-opus-4-5", - "display_name": "claude-opus-4-5", + "id": "claude-opus-4-1-20250805-thinking", + "name": "claude-opus-4-1-20250805-thinking", + "display_name": "claude-opus-4-1-20250805-thinking", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -65230,29 +66818,23 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", + "default_enabled": true, + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -65260,22 +66842,22 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-25", - "last_updated": "2025-11-25", + "knowledge": "2025-03", + "release_date": "2025-05-27", + "last_updated": "2025-05-27", "type": "chat" }, { - "id": "grok-4.20-beta-0309-non-reasoning", - "name": "grok-4.20-beta-0309-non-reasoning", - "display_name": "grok-4.20-beta-0309-non-reasoning", + "id": "chatgpt-4o-latest", + "name": "chatgpt-4o-latest", + "display_name": "chatgpt-4o-latest", "modalities": { "input": [ "text", @@ -65286,122 +66868,113 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2023-09", + "release_date": "2024-08-08", + "last_updated": "2024-08-08", "type": "chat" }, { - "id": "gpt-5.4-mini-2026-03-17", - "name": "gpt-5.4-mini-2026-03-17", - "display_name": "gpt-5.4-mini-2026-03-17", + "id": "glm-4.7-flashx", + "name": "glm-4.7-flashx", + "display_name": "glm-4.7-flashx", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-19", - "last_updated": "2026-03-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-20", + "last_updated": "2026-01-20", "type": "chat" }, { - "id": "glm-4.5-x", - "name": "glm-4.5-x", - "display_name": "glm-4.5-x", + "id": "gemini-3-pro-image-preview", + "name": "gemini-3-pro-image-preview", + "display_name": "gemini-3-pro-image-preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32768, + "output": 64000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-29", - "last_updated": "2025-07-29", - "type": "chat" + "knowledge": "2025-06", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "type": "imageGeneration" }, { - "id": "gpt-4.1", - "name": "gpt-4.1", - "display_name": "gpt-4.1", + "id": "ministral-14b-2512", + "name": "ministral-14b-2512", + "display_name": "ministral-14b-2512", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -65410,166 +66983,106 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2024-12", + "release_date": "2025-12-16", + "last_updated": "2025-12-16", "type": "chat" }, { - "id": "claude-opus-4-20250514", - "name": "claude-opus-4-20250514", - "display_name": "claude-opus-4-20250514", + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2025-10-26", + "last_updated": "2025-10-26", "type": "chat" }, { - "id": "claude-sonnet-4-6-thinking", - "name": "claude-sonnet-4-6-thinking", - "display_name": "claude-sonnet-4-6-thinking", + "id": "gpt-5.2-chat-latest", + "name": "gpt-5.2-chat-latest", + "display_name": "gpt-5.2-chat-latest", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-08", - "release_date": "2026-02-18", - "last_updated": "2026-03-13", + "knowledge": "2025-08-31", + "release_date": "2025-12-12", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "deepseek-reasoner", - "name": "Deepseek-Reasoner", - "display_name": "Deepseek-Reasoner", + "id": "grok-4.1", + "name": "grok-4.1", + "display_name": "grok-4.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2025-06", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "gpt-5-thinking", - "name": "gpt-5-thinking", - "display_name": "gpt-5-thinking", + "id": "gemini-2.5-flash-nothink", + "name": "gemini-2.5-flash-nothink", + "display_name": "gemini-2.5-flash-nothink", "modalities": { "input": [ "text", @@ -65580,8 +67093,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -65589,75 +67102,102 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "knowledge": "2025-01", + "release_date": "2025-06-24", + "last_updated": "2025-06-24", "type": "chat" }, { - "id": "doubao-seed-code-preview-251028", - "name": "doubao-seed-code-preview-251028", - "display_name": "doubao-seed-code-preview-251028", + "id": "MiniMax-M1", + "name": "MiniMax-M1", + "display_name": "MiniMax-M1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-11-11", - "last_updated": "2025-11-11", + "release_date": "2025-06-16", + "last_updated": "2025-06-16", "type": "chat" }, { - "id": "gpt-5.1-chat-latest", - "name": "gpt-5.1-chat-latest", - "display_name": "gpt-5.1-chat-latest", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "release_date": "2026-03-19", + "last_updated": "2026-03-19", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "claude-opus-4-1-20250805", - "display_name": "claude-opus-4-1-20250805", + "id": "claude-opus-4-6-thinking", + "name": "claude-opus-4-6-thinking", + "display_name": "claude-opus-4-6-thinking", "modalities": { "input": [ "text", @@ -65669,24 +67209,31 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", + "default_enabled": true, + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -65694,54 +67241,74 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-02-06", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen-max-latest", - "name": "Qwen-Max-Latest", - "display_name": "Qwen-Max-Latest", + "id": "gemini-3-flash-preview", + "name": "gemini-3-flash-preview", + "display_name": "gemini-3-flash-preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-11", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "knowledge": "2025-06", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "mistral-large-2512", - "name": "mistral-large-2512", - "display_name": "mistral-large-2512", + "id": "deepseek-v3.2-thinking", + "name": "DeepSeek-V3.2-Thinking", + "display_name": "DeepSeek-V3.2-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -65749,41 +67316,32 @@ }, "limit": { "context": 128000, - "output": 262144 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2024-12", - "release_date": "2025-12-16", - "last_updated": "2025-12-16", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" - } - ] - }, - "helicone": { - "id": "helicone", - "name": "Helicone", - "display_name": "Helicone", - "api": "https://ai-gateway.helicone.ai/v1", - "doc": "https://helicone.ai/models", - "models": [ + }, { - "id": "gpt-5.1-codex-mini", - "name": "OpenAI: GPT-5.1 Codex Mini", - "display_name": "OpenAI: GPT-5.1 Codex Mini", + "id": "gpt-5", + "name": "gpt-5", + "display_name": "gpt-5", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { @@ -65794,16 +67352,16 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high" @@ -65817,17 +67375,17 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-09-30", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "type": "chat" }, { - "id": "grok-4", - "name": "xAI Grok 4", - "display_name": "xAI Grok 4", + "id": "qwen3-235b-a22b", + "name": "Qwen3-235B-A22B", + "display_name": "Qwen3-235B-A22B", "modalities": { "input": [ "text" @@ -65837,8 +67395,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -65847,20 +67405,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-09", - "last_updated": "2024-07-09", + "knowledge": "2025-04", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "qwen2.5-coder-7b-fast", - "name": "Qwen2.5 Coder 7B fast", - "display_name": "Qwen2.5 Coder 7B fast", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -65870,65 +67434,117 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2024-09-15", - "last_updated": "2024-09-15", + "release_date": "2025-12-19", + "last_updated": "2025-12-19", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "gemini-3.1-flash-image-preview", + "name": "gemini-3.1-flash-image-preview", + "display_name": "gemini-3.1-flash-image-preview", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 131072, - "output": 40960 + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-27", + "last_updated": "2026-02-27", + "type": "imageGeneration" + }, + { + "id": "claude-sonnet-4-5", + "name": "claude-sonnet-4-5", + "display_name": "claude-sonnet-4-5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2025-07-31", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "OpenAI GPT-4.1 Mini", - "display_name": "OpenAI GPT-4.1 Mini", + "id": "grok-4.20-multi-agent-beta-0309", + "name": "grok-4.20-multi-agent-beta-0309", + "display_name": "grok-4.20-multi-agent-beta-0309", "modalities": { "input": [ "text", @@ -65939,25 +67555,30 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gpt-4o", - "name": "OpenAI GPT-4o", - "display_name": "OpenAI GPT-4o", + "id": "grok-4-fast-non-reasoning", + "name": "grok-4-fast-non-reasoning", + "display_name": "grok-4-fast-non-reasoning", "modalities": { "input": [ "text", @@ -65968,25 +67589,25 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "knowledge": "2025-06", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "kimi-k2-0711", - "name": "Kimi K2 (07/11)", - "display_name": "Kimi K2 (07/11)", + "id": "glm-4.6", + "name": "glm-4.6", + "display_name": "glm-4.6", "modalities": { "input": [ "text" @@ -65996,25 +67617,31 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "display_name": "Anthropic: Claude 3.7 Sonnet", + "id": "gemini-2.5-flash-preview-09-2025", + "name": "gemini-2.5-flash-preview-09-2025", + "display_name": "gemini-2.5-flash-preview-09-2025", "modalities": { "input": [ "text", @@ -66025,81 +67652,99 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, "unit": "tokens" }, - "interleaved": false, - "summaries": false, - "visibility": "full", + "summaries": true, + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-02", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "knowledge": "2025-01", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "grok-4-fast-reasoning", - "name": "xAI: Grok 4 Fast Reasoning", - "display_name": "xAI: Grok 4 Fast Reasoning", + "id": "gpt-5.4", + "name": "gpt-5.4", + "display_name": "gpt-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-01", - "last_updated": "2025-09-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "grok-4-1-fast-reasoning", + "name": "grok-4-1-fast-reasoning", + "display_name": "grok-4-1-fast-reasoning", "modalities": { "input": [ "text", @@ -66110,48 +67755,42 @@ ] }, "limit": { - "context": 41000, - "output": 41000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-06", - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Google Gemini 2.5 Flash", - "display_name": "Google Gemini 2.5 Flash", + "id": "glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -66159,49 +67798,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": false, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "OpenAI GPT-4.1 Nano", - "display_name": "OpenAI GPT-4.1 Nano", + "id": "qwen3-max-2025-09-23", + "name": "qwen3-max-2025-09-23", + "display_name": "qwen3-max-2025-09-23", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 258048, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -66211,53 +67829,79 @@ "attachment": false, "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2025-09-24", + "last_updated": "2025-09-24", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "claude-sonnet-4-5-20250929", + "name": "claude-sonnet-4-5-20250929", + "display_name": "claude-sonnet-4-5-20250929", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "knowledge": "2025-07-31", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "OpenAI GPT-OSS 20b", - "display_name": "OpenAI GPT-OSS 20b", + "id": "glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 64000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -66265,34 +67909,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "chatgpt-4o-latest", - "name": "OpenAI ChatGPT-4o", - "display_name": "OpenAI ChatGPT-4o", + "id": "kimi-k2-0905-preview", + "name": "kimi-k2-0905-preview", + "display_name": "kimi-k2-0905-preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -66301,18 +67939,20 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-08", - "release_date": "2024-08-14", - "last_updated": "2024-08-14", + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "o3-mini", - "name": "OpenAI o3 Mini", - "display_name": "OpenAI o3 Mini", + "id": "claude-opus-4-5-20251101", + "name": "claude-opus-4-5-20251101", + "display_name": "claude-opus-4-5-20251101", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -66320,72 +67960,104 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2023-10", - "release_date": "2023-10-01", - "last_updated": "2023-10-01", + "knowledge": "2025-03-31", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "grok-code-fast-1", - "name": "xAI Grok Code Fast 1", - "display_name": "xAI Grok Code Fast 1", + "id": "gpt-5.4-nano", + "name": "gpt-5.4-nano", + "display_name": "gpt-5.4-nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 10000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-08", - "release_date": "2024-08-25", - "last_updated": "2024-08-25", + "knowledge": "2025-08-31", + "release_date": "2026-03-19", + "last_updated": "2026-03-19", "type": "chat" }, { - "id": "sonar-deep-research", - "name": "Perplexity Sonar Deep Research", - "display_name": "Perplexity Sonar Deep Research", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "qwen3-235b-a22b-instruct-2507", + "display_name": "qwen3-235b-a22b-instruct-2507", "modalities": { "input": [ "text" @@ -66395,82 +68067,100 @@ ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 128000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "knowledge": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "sonar", - "name": "Perplexity Sonar", - "display_name": "Perplexity Sonar", + "id": "claude-3-5-haiku-latest", + "name": "claude-3-5-haiku-latest", + "display_name": "claude-3-5-haiku-latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 200000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "knowledge": "2024-07-31", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "llama-3.3-70b-versatile", - "name": "Meta Llama 3.3 70B Versatile", - "display_name": "Meta Llama 3.3 70B Versatile", + "id": "gpt-5-pro", + "name": "gpt-5-pro", + "display_name": "gpt-5-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32678 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2024-09-30", + "release_date": "2025-10-08", + "last_updated": "2025-10-08", "type": "chat" }, { - "id": "sonar-pro", - "name": "Perplexity Sonar Pro", - "display_name": "Perplexity Sonar Pro", + "id": "qwen-flash", + "name": "Qwen-Flash", + "display_name": "Qwen-Flash", "modalities": { "input": [ "text" @@ -66480,25 +68170,35 @@ ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 1000000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "mistral-large-2411", - "name": "Mistral-Large", - "display_name": "Mistral-Large", + "id": "deepseek-v3.2", + "name": "deepseek-v3.2", + "display_name": "deepseek-v3.2", "modalities": { "input": [ "text" @@ -66509,35 +68209,41 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-24", - "last_updated": "2024-07-24", + "knowledge": "2024-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill Llama 70B", - "display_name": "DeepSeek R1 Distill Llama 70B", + "id": "doubao-seed-1-6-thinking-250715", + "name": "doubao-seed-1-6-thinking-250715", + "display_name": "doubao-seed-1-6-thinking-250715", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -66545,26 +68251,19 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "display_name": "Anthropic: Claude 3.5 Haiku", + "id": "glm-for-coding", + "name": "glm-for-coding", + "display_name": "glm-for-coding", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -66572,24 +68271,24 @@ }, "limit": { "context": 200000, - "output": 8192 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Anthropic: Claude Opus 4.1", - "display_name": "Anthropic: Claude Opus 4.1", + "id": "gpt-5.4-mini", + "name": "gpt-5.4-mini", + "display_name": "gpt-5.4-mini", "modalities": { "input": [ "text", @@ -66600,10 +68299,10 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -66613,6 +68312,59 @@ "reasoning": { "supported": true, "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-19", + "last_updated": "2026-03-19", + "type": "chat" + }, + { + "id": "claude-sonnet-4-5-20250929-thinking", + "name": "claude-sonnet-4-5-20250929-thinking", + "display_name": "claude-sonnet-4-5-20250929-thinking", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, "mode": "budget", "budget": { "min": 1024, @@ -66630,90 +68382,96 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-08", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-03", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "o3-pro", - "name": "OpenAI o3 Pro", - "display_name": "OpenAI o3 Pro", + "id": "qwen-plus", + "name": "Qwen-Plus", + "display_name": "Qwen-Plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "knowledge": "2024-10", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "OpenAI GPT-4o-mini", - "display_name": "OpenAI GPT-4o-mini", + "id": "glm-4.7", + "name": "glm-4.7", + "display_name": "glm-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "gpt-5", - "name": "OpenAI GPT-5", - "display_name": "OpenAI GPT-5", + "id": "gpt-5.2", + "name": "gpt-5.2", + "display_name": "gpt-5.2", "modalities": { "input": [ "text", @@ -66731,19 +68489,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -66754,49 +68513,51 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-08-31", + "release_date": "2025-12-12", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "llama-3.1-8b-instant", - "name": "Meta Llama 3.1 8B Instant", - "display_name": "Meta Llama 3.1 8B Instant", + "id": "gemini-2.5-flash-image", + "name": "gemini-2.5-flash-image", + "display_name": "gemini-2.5-flash-image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32678 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-01", - "last_updated": "2024-07-01", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-10-08", + "last_updated": "2025-10-08", + "type": "imageGeneration" }, { - "id": "claude-4.5-opus", - "name": "Anthropic: Claude Opus 4.5", - "display_name": "Anthropic: Claude Opus 4.5", + "id": "claude-3-5-haiku-20241022", + "name": "claude-3-5-haiku-20241022", + "display_name": "claude-3-5-haiku-20241022", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -66804,25 +68565,24 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2024-07-31", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "claude-4.5-sonnet", - "name": "Anthropic: Claude Sonnet 4.5", - "display_name": "Anthropic: Claude Sonnet 4.5", + "id": "gpt-5-mini", + "name": "gpt-5-mini", + "display_name": "gpt-5-mini", "modalities": { "input": [ "text", @@ -66832,35 +68592,6 @@ "text" ] }, - "limit": { - "context": 200000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "type": "chat" - }, - { - "id": "gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "display_name": "OpenAI: GPT-5 Codex", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, "limit": { "context": 400000, "output": 128000 @@ -66892,58 +68623,80 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-05-30", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Meta Llama 3.3 70B Instruct", - "display_name": "Meta Llama 3.3 70B Instruct", + "id": "claude-haiku-4-5-20251001", + "name": "claude-haiku-4-5-20251001", + "display_name": "claude-haiku-4-5-20251001", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16400 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-02-28", + "release_date": "2025-10-16", + "last_updated": "2025-10-16", "type": "chat" }, { - "id": "grok-4-fast-non-reasoning", - "name": "xAI Grok 4 Fast Non-Reasoning", - "display_name": "xAI Grok 4 Fast Non-Reasoning", + "id": "deepseek-chat", + "name": "Deepseek-Chat", + "display_name": "Deepseek-Chat", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -66952,49 +68705,43 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-19", - "last_updated": "2025-09-19", + "knowledge": "2024-07", + "release_date": "2024-11-29", + "last_updated": "2024-11-29", "type": "chat" }, { - "id": "glm-4.6", - "name": "Zai GLM-4.6", - "display_name": "Zai GLM-4.6", + "id": "doubao-seed-1-8-251215", + "name": "doubao-seed-1-8-251215", + "display_name": "doubao-seed-1-8-251215", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 224000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "gpt-5-chat-latest", - "name": "OpenAI GPT-5 Chat Latest", - "display_name": "OpenAI GPT-5 Chat Latest", + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "gemini-2.5-flash-lite-preview-09-2025", + "display_name": "gemini-2.5-flash-lite-preview-09-2025", "modalities": { "input": [ "text", @@ -67005,37 +68752,56 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2024-09-30", - "last_updated": "2024-09-30", + "knowledge": "2025-01", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "claude-4.5-haiku", - "name": "Anthropic: Claude 4.5 Haiku", - "display_name": "Anthropic: Claude 4.5 Haiku", + "id": "glm-4.5-airx", + "name": "glm-4.5-airx", + "display_name": "glm-4.5-airx", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -67044,15 +68810,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-10-01", - "last_updated": "2025-10-01", + "knowledge": "2025-04", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "xAI Grok 4.1 Fast Reasoning", - "display_name": "xAI Grok 4.1 Fast Reasoning", + "id": "claude-opus-4-5-20251101-thinking", + "name": "claude-opus-4-5-20251101-thinking", + "display_name": "claude-opus-4-5-20251101-thinking", "modalities": { "input": [ "text", @@ -67063,8 +68829,8 @@ ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -67074,20 +68840,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-17", - "last_updated": "2025-11-17", + "knowledge": "2025-03", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Anthropic: Claude Sonnet 4.5 (20250929)", - "display_name": "Anthropic: Claude Sonnet 4.5 (20250929)", + "id": "gpt-5.1", + "name": "gpt-5.1", + "display_name": "gpt-5.1", "modalities": { "input": [ "text", @@ -67098,10 +68886,10 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -67111,62 +68899,86 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "hermes-2-pro-llama-3-8b", - "name": "Hermes 2 Pro Llama 3 8B", - "display_name": "Hermes 2 Pro Llama 3 8B", + "id": "gpt-5.4-nano-2026-03-17", + "name": "gpt-5.4-nano-2026-03-17", + "display_name": "gpt-5.4-nano-2026-03-17", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-05-27", - "last_updated": "2024-05-27", + "knowledge": "2025-08-31", + "release_date": "2026-03-19", + "last_updated": "2026-03-19", "type": "chat" }, { - "id": "ernie-4.5-21b-a3b-thinking", - "name": "Baidu Ernie 4.5 21B A3B Thinking", - "display_name": "Baidu Ernie 4.5 21B A3B Thinking", + "id": "kimi-k2-thinking", + "name": "kimi-k2-thinking", + "display_name": "kimi-k2-thinking", "modalities": { "input": [ "text" @@ -67176,26 +68988,37 @@ ] }, "limit": { - "context": 128000, - "output": 8000 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-03-16", - "last_updated": "2025-03-16", + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ "text" @@ -67205,53 +69028,84 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "release_date": "2026-03-19", + "last_updated": "2026-03-19", "type": "chat" }, { - "id": "llama-prompt-guard-2-22m", - "name": "Meta Llama Prompt Guard 2 22M", - "display_name": "Meta Llama Prompt Guard 2 22M", + "id": "gemini-2.5-pro", + "name": "gemini-2.5-pro", + "display_name": "gemini-2.5-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 2 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "grok-4-1-fast-non-reasoning", + "name": "grok-4-1-fast-non-reasoning", + "display_name": "grok-4-1-fast-non-reasoning", "modalities": { "input": [ "text", @@ -67262,55 +69116,72 @@ ] }, "limit": { - "context": 128000, - "output": 16400 + "context": 2000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-06", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "gemini-3-pro-preview", + "name": "gemini-3-pro-preview", + "display_name": "gemini-3-pro-preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-06", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "display_name": "OpenAI: GPT-5 Pro", + "id": "glm-5-turbo", + "name": "glm-5-turbo", + "display_name": "glm-5-turbo", "modalities": { "input": [ "text" @@ -67320,11 +69191,11 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 200000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -67332,95 +69203,129 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "llama-4-maverick", - "name": "Meta Llama 4 Maverick 17B 128E", - "display_name": "Meta Llama 4 Maverick 17B 128E", + "id": "glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "claude-opus-4-7", + "name": "claude-opus-4-7", + "display_name": "claude-opus-4-7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "knowledge": "2026-01-31", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "display_name": "Anthropic: Claude Sonnet 4", + "id": "claude-sonnet-4-20250514", + "name": "claude-sonnet-4-20250514", + "display_name": "claude-sonnet-4-20250514", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -67457,133 +69362,171 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-14", - "last_updated": "2025-05-14", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "deepseek-tng-r1t2-chimera", - "name": "DeepSeek TNG R1T2 Chimera", - "display_name": "DeepSeek TNG R1T2 Chimera", + "id": "gemini-2.0-flash-lite", + "name": "gemini-2.0-flash-lite", + "display_name": "gemini-2.0-flash-lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 130000, - "output": 163840 + "context": 2000000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-02", - "last_updated": "2025-07-02", + "knowledge": "2024-11", + "release_date": "2025-06-16", + "last_updated": "2025-06-16", "type": "chat" }, { - "id": "gemma-3-12b-it", - "name": "Google Gemma 3 12B", - "display_name": "Google Gemma 3 12B", + "id": "claude-opus-4-5", + "name": "claude-opus-4-5", + "display_name": "claude-opus-4-5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "knowledge": "2025-03-31", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "OpenAI GPT-OSS 120b", - "display_name": "OpenAI GPT-OSS 120b", + "id": "grok-4.20-beta-0309-non-reasoning", + "name": "grok-4.20-beta-0309-non-reasoning", + "display_name": "grok-4.20-beta-0309-non-reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "o1", - "name": "OpenAI: o1", - "display_name": "OpenAI: o1", + "id": "gpt-5.4-mini-2026-03-17", + "name": "gpt-5.4-mini-2026-03-17", + "display_name": "gpt-5.4-mini-2026-03-17", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -67591,29 +69534,28 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-19", + "last_updated": "2026-03-19", "type": "chat" }, { - "id": "llama-4-scout", - "name": "Meta Llama 4 Scout 17B 16E", - "display_name": "Meta Llama 4 Scout 17B 16E", + "id": "glm-4.5-x", + "name": "glm-4.5-x", + "display_name": "glm-4.5-x", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -67622,47 +69564,50 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-04", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "llama-3.1-8b-instruct-turbo", - "name": "Meta Llama 3.1 8B Instruct Turbo", - "display_name": "Meta Llama 3.1 8B Instruct Turbo", + "id": "gpt-4.1", + "name": "gpt-4.1", + "display_name": "gpt-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "claude-3.5-sonnet-v2", - "name": "Anthropic: Claude 3.5 Sonnet v2", - "display_name": "Anthropic: Claude 3.5 Sonnet v2", + "id": "claude-opus-4-20250514", + "name": "claude-opus-4-20250514", + "display_name": "claude-opus-4-20250514", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -67670,38 +69615,61 @@ }, "limit": { "context": 200000, - "output": 8192 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "OpenAI GPT-5 Mini", - "display_name": "OpenAI GPT-5 Mini", + "id": "claude-sonnet-4-6-thinking", + "name": "claude-sonnet-4-6-thinking", + "display_name": "claude-sonnet-4-6-thinking", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -67711,34 +69679,139 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08", + "release_date": "2026-02-18", + "last_updated": "2026-03-13", + "type": "chat" + }, + { + "id": "deepseek-reasoner", + "name": "Deepseek-Reasoner", + "display_name": "Deepseek-Reasoner", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Anthropic: Claude 4.5 Haiku (20251001)", - "display_name": "Anthropic: Claude 4.5 Haiku (20251001)", + "id": "gpt-5-thinking", + "name": "gpt-5-thinking", + "display_name": "gpt-5-thinking", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", + "type": "chat" + }, + { + "id": "doubao-seed-code-preview-251028", + "name": "doubao-seed-code-preview-251028", + "display_name": "doubao-seed-code-preview-251028", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-11-11", + "last_updated": "2025-11-11", + "type": "chat" + }, + { + "id": "gpt-5.1-chat-latest", + "name": "gpt-5.1-chat-latest", + "display_name": "gpt-5.1-chat-latest", "modalities": { "input": [ "text", @@ -67748,9 +69821,40 @@ "text" ] }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "type": "chat" + }, + { + "id": "claude-opus-4-1-20250805", + "name": "claude-opus-4-1-20250805", + "display_name": "claude-opus-4-1-20250805", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, "limit": { "context": 200000, - "output": 8192 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -67779,29 +69883,28 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-10-01", - "last_updated": "2025-10-01", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mistral-small", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "qwen-max-latest", + "name": "Qwen-Max-Latest", + "display_name": "Qwen-Max-Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -67809,19 +69912,20 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2024-11", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "deepseek-v3.1-terminus", - "name": "DeepSeek V3.1 Terminus", - "display_name": "DeepSeek V3.1 Terminus", + "id": "mistral-large-2512", + "name": "mistral-large-2512", + "display_name": "mistral-large-2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -67829,25 +69933,33 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "knowledge": "2024-12", + "release_date": "2025-12-16", + "last_updated": "2025-12-16", "type": "chat" - }, + } + ] + }, + "helicone": { + "id": "helicone", + "name": "Helicone", + "display_name": "Helicone", + "api": "https://ai-gateway.helicone.ai/v1", + "doc": "https://helicone.ai/models", + "models": [ { - "id": "gpt-5.1", - "name": "OpenAI GPT-5.1", - "display_name": "OpenAI GPT-5.1", + "id": "gpt-5.1-codex-mini", + "name": "OpenAI: GPT-5.1 Codex Mini", + "display_name": "OpenAI: GPT-5.1 Codex Mini", "modalities": { "input": [ "text", @@ -67897,9 +70009,9 @@ "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "grok-4", + "name": "xAI Grok 4", + "display_name": "xAI Grok 4", "modalities": { "input": [ "text" @@ -67910,7 +70022,7 @@ }, "limit": { "context": 256000, - "output": 262144 + "output": 256000 }, "temperature": true, "tool_call": true, @@ -67919,26 +70031,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "knowledge": "2024-07", + "release_date": "2024-07-09", + "last_updated": "2024-07-09", "type": "chat" }, { - "id": "gemma2-9b-it", - "name": "Google Gemma 2", - "display_name": "Google Gemma 2", + "id": "qwen2.5-coder-7b-fast", + "name": "Qwen2.5 Coder 7B fast", + "display_name": "Qwen2.5 Coder 7B fast", "modalities": { "input": [ "text" @@ -67948,7 +70054,7 @@ ] }, "limit": { - "context": 8192, + "context": 32000, "output": 8192 }, "temperature": true, @@ -67958,27 +70064,26 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-25", - "last_updated": "2024-06-25", + "knowledge": "2024-09", + "release_date": "2024-09-15", + "last_updated": "2024-09-15", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Google Gemini 2.5 Pro", - "display_name": "Google Gemini 2.5 Pro", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 40960 }, "temperature": true, "tool_call": true, @@ -67989,46 +70094,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "xAI Grok 4.1 Fast Non-Reasoning", - "display_name": "xAI Grok 4.1 Fast Non-Reasoning", + "id": "gpt-4.1-mini", + "name": "OpenAI GPT-4.1 Mini", + "display_name": "OpenAI GPT-4.1 Mini", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -68037,67 +70133,44 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-17", - "last_updated": "2025-11-17", + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "OpenAI: GPT-5.1 Codex", - "display_name": "OpenAI: GPT-5.1 Codex", + "id": "gpt-4o", + "name": "OpenAI GPT-4o", + "display_name": "OpenAI GPT-4o", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-05", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "llama-3.1-8b-instruct", - "name": "Meta Llama 3.1 8B Instruct", - "display_name": "Meta Llama 3.1 8B Instruct", + "id": "kimi-k2-0711", + "name": "Kimi K2 (07/11)", + "display_name": "Kimi K2 (07/11)", "modalities": { "input": [ "text" @@ -68107,7 +70180,7 @@ ] }, "limit": { - "context": 16384, + "context": 131072, "output": 16384 }, "temperature": true, @@ -68117,15 +70190,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "display_name": "Anthropic: Claude Opus 4", + "id": "claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "display_name": "Anthropic: Claude 3.7 Sonnet", "modalities": { "input": [ "text", @@ -68137,7 +70210,7 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -68154,29 +70227,28 @@ "min": 1024, "unit": "tokens" }, - "interleaved": true, - "summaries": true, - "visibility": "summary", + "interleaved": false, + "summaries": false, + "visibility": "full", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic uses thinking budget tokens" ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-14", - "last_updated": "2025-05-14", + "knowledge": "2025-02", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "OpenAI GPT-5 Nano", - "display_name": "OpenAI GPT-5 Nano", + "id": "grok-4-fast-reasoning", + "name": "xAI: Grok 4 Fast Reasoning", + "display_name": "xAI: Grok 4 Fast Reasoning", "modalities": { "input": [ "text", @@ -68187,10 +70259,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -68198,85 +70270,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-09", + "release_date": "2025-09-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "Google Gemini 3 Pro Preview", - "display_name": "Google Gemini 3 Pro Preview", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 41000, + "output": 41000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2025-06", + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Google Gemini 2.5 Flash Lite", - "display_name": "Google Gemini 2.5 Flash Lite", + "id": "gemini-2.5-flash", + "name": "Google Gemini 2.5 Flash", + "display_name": "Google Gemini 2.5 Flash", "modalities": { "input": [ "text", @@ -68294,18 +70341,19 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { "default": -1, - "min": 512, + "min": 0, "max": 24576, "auto": -1, + "off": 0, "unit": "tokens" }, "summaries": true, @@ -68317,15 +70365,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2025-06", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "o3", - "name": "OpenAI o3", - "display_name": "OpenAI o3", + "id": "gpt-4.1-nano", + "name": "OpenAI GPT-4.1 Nano", + "display_name": "OpenAI GPT-4.1 Nano", "modalities": { "input": [ "text", @@ -68336,40 +70384,25 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "llama-prompt-guard-2-86m", - "name": "Meta Llama Prompt Guard 2 86M", - "display_name": "Meta Llama Prompt Guard 2 86M", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ "text" @@ -68379,25 +70412,59 @@ ] }, "limit": { - "context": 512, - "output": 2 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "knowledge": "2025-07", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "gpt-4.1", - "name": "OpenAI GPT-4.1", - "display_name": "OpenAI GPT-4.1", + "id": "gpt-oss-20b", + "name": "OpenAI GPT-OSS 20b", + "display_name": "OpenAI GPT-OSS 20b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", + "type": "chat" + }, + { + "id": "chatgpt-4o-latest", + "name": "OpenAI ChatGPT-4o", + "display_name": "OpenAI ChatGPT-4o", "modalities": { "input": [ "text", @@ -68408,8 +70475,8 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68418,19 +70485,18 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2024-08", + "release_date": "2024-08-14", + "last_updated": "2024-08-14", "type": "chat" }, { - "id": "o4-mini", - "name": "OpenAI o4 Mini", - "display_name": "OpenAI o4 Mini", + "id": "o3-mini", + "name": "OpenAI o3 Mini", + "display_name": "OpenAI o3 Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -68462,44 +70528,48 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "knowledge": "2023-10", + "release_date": "2023-10-01", + "last_updated": "2023-10-01", "type": "chat" }, { - "id": "claude-3-haiku-20240307", - "name": "Anthropic: Claude 3 Haiku", - "display_name": "Anthropic: Claude 3 Haiku", + "id": "grok-code-fast-1", + "name": "xAI Grok Code Fast 1", + "display_name": "xAI Grok Code Fast 1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 256000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-03-07", - "last_updated": "2024-03-07", + "knowledge": "2024-08", + "release_date": "2024-08-25", + "last_updated": "2024-08-25", "type": "chat" }, { - "id": "grok-3-mini", - "name": "xAI Grok 3 Mini", - "display_name": "xAI Grok 3 Mini", + "id": "sonar-deep-research", + "name": "Perplexity Sonar Deep Research", + "display_name": "Perplexity Sonar Deep Research", "modalities": { "input": [ "text" @@ -68509,25 +70579,26 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 127000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "knowledge": "2025-01", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" }, { - "id": "o1-mini", - "name": "OpenAI: o1-mini", - "display_name": "OpenAI: o1-mini", + "id": "sonar", + "name": "Perplexity Sonar", + "display_name": "Perplexity Sonar", "modalities": { "input": [ "text" @@ -68537,40 +70608,25 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 127000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" }, { - "id": "kimi-k2-0905", - "name": "Kimi K2 (09/05)", - "display_name": "Kimi K2 (09/05)", + "id": "llama-3.3-70b-versatile", + "name": "Meta Llama 3.3 70B Versatile", + "display_name": "Meta Llama 3.3 70B Versatile", "modalities": { "input": [ "text" @@ -68580,8 +70636,8 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 32678 }, "temperature": true, "tool_call": true, @@ -68590,26 +70646,53 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2024-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "gpt-4.1-mini-2025-04-14", - "name": "OpenAI GPT-4.1 Mini", - "display_name": "OpenAI GPT-4.1 Mini", + "id": "sonar-pro", + "name": "Perplexity Sonar Pro", + "display_name": "Perplexity Sonar Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, + "context": 200000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", + "type": "chat" + }, + { + "id": "mistral-large-2411", + "name": "Mistral-Large", + "display_name": "Mistral-Large", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, "output": 32768 }, "temperature": true, @@ -68619,15 +70702,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2024-07", + "release_date": "2024-07-24", + "last_updated": "2024-07-24", "type": "chat" }, { - "id": "deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "display_name": "DeepSeek R1 Distill Llama 70B", "modalities": { "input": [ "text" @@ -68638,22 +70721,17 @@ }, "limit": { "context": 128000, - "output": 64000 + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, @@ -68664,23 +70742,21 @@ "type": "chat" }, { - "id": "qwen3-coder", - "name": "Qwen3 Coder 480B A35B Instruct Turbo", - "display_name": "Qwen3 Coder 480B A35B Instruct Turbo", + "id": "claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "display_name": "Anthropic: Claude 3.5 Haiku", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -68689,45 +70765,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", - "type": "chat" - }, - { - "id": "gpt-5.1-chat-latest", - "name": "OpenAI GPT-5.1 Chat", - "display_name": "OpenAI GPT-5.1 Chat", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-10", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "Anthropic: Claude Opus 4.1 (20250805)", - "display_name": "Anthropic: Claude Opus 4.1 (20250805)", + "id": "claude-opus-4-1", + "name": "Anthropic: Claude Opus 4.1", + "display_name": "Anthropic: Claude Opus 4.1", "modalities": { "input": [ "text", @@ -68776,25 +70822,41 @@ "type": "chat" }, { - "id": "grok-3", - "name": "xAI Grok 3", - "display_name": "xAI Grok 3", + "id": "o3-pro", + "name": "OpenAI o3 Pro", + "display_name": "OpenAI o3 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, "open_weights": false, @@ -68804,56 +70866,77 @@ "type": "chat" }, { - "id": "sonar-reasoning", - "name": "Perplexity Sonar Reasoning", - "display_name": "Perplexity Sonar Reasoning", + "id": "gpt-4o-mini", + "name": "OpenAI GPT-4o-mini", + "display_name": "OpenAI GPT-4o-mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "gpt-5", + "name": "OpenAI GPT-5", + "display_name": "OpenAI GPT-5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, "open_weights": false, @@ -68863,51 +70946,37 @@ "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking", - "name": "Qwen3 235B A22B Thinking", - "display_name": "Qwen3 235B A22B Thinking", + "id": "llama-3.1-8b-instant", + "name": "Meta Llama 3.1 8B Instant", + "display_name": "Meta Llama 3.1 8B Instant", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 131072, + "output": 32678 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "llama-guard-4", - "name": "Meta Llama Guard 4 12B", - "display_name": "Meta Llama Guard 4 12B", + "id": "claude-4.5-opus", + "name": "Anthropic: Claude Opus 4.5", + "display_name": "Anthropic: Claude Opus 4.5", "modalities": { "input": [ "text", @@ -68918,78 +70987,69 @@ ] }, "limit": { - "context": 131072, - "output": 1024 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-11", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "sonar-reasoning-pro", - "name": "Perplexity Sonar Reasoning Pro", - "display_name": "Perplexity Sonar Reasoning Pro", + "id": "claude-4.5-sonnet", + "name": "Anthropic: Claude Sonnet 4.5", + "display_name": "Anthropic: Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "knowledge": "2025-09", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" - } - ] - }, - "alibaba-coding-plan": { - "id": "alibaba-coding-plan", - "name": "Alibaba Coding Plan", - "display_name": "Alibaba Coding Plan", - "api": "https://coding-intl.dashscope.aliyuncs.com/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", - "models": [ + }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "display_name": "OpenAI: GPT-5 Codex", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -68997,20 +71057,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "llama-3.3-70b-instruct", + "name": "Meta Llama 3.3 70B Instruct", + "display_name": "Meta Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -69020,91 +71096,66 @@ ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 128000, + "output": 16400 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "knowledge": "2024-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "grok-4-fast-non-reasoning", + "name": "xAI Grok 4 Fast Non-Reasoning", + "display_name": "xAI Grok 4 Fast Non-Reasoning", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-09", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "glm-4.6", + "name": "Zai GLM-4.6", + "display_name": "Zai GLM-4.6", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -69114,70 +71165,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": false, + "open_weights": false, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "gpt-5-chat-latest", + "name": "OpenAI GPT-5 Chat Latest", + "display_name": "OpenAI GPT-5 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2024-09", + "release_date": "2024-09-30", + "last_updated": "2024-09-30", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "claude-4.5-haiku", + "name": "Anthropic: Claude 4.5 Haiku", + "display_name": "Anthropic: Claude 4.5 Haiku", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -69185,27 +71227,28 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "open_weights": false, + "knowledge": "2025-10", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "grok-4-1-fast-reasoning", + "name": "xAI Grok 4.1 Fast Reasoning", + "display_name": "xAI Grok 4.1 Fast Reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, @@ -69215,65 +71258,71 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-17", + "last_updated": "2025-11-17", "type": "chat" }, { - "id": "qwen3-max-2026-01-23", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "claude-sonnet-4-5-20250929", + "name": "Anthropic: Claude Sonnet 4.5 (20250929)", + "display_name": "Anthropic: Claude Sonnet 4.5 (20250929)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "knowledge": "2025-09", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "hermes-2-pro-llama-3-8b", + "name": "Hermes 2 Pro Llama 3 8B", + "display_name": "Hermes 2 Pro Llama 3 8B", "modalities": { "input": [ "text" @@ -69283,77 +71332,54 @@ ] }, "limit": { - "context": 196608, - "output": 24576 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-05-27", + "last_updated": "2024-05-27", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "ernie-4.5-21b-a3b-thinking", + "name": "Baidu Ernie 4.5 21B A3B Thinking", + "display_name": "Baidu Ernie 4.5 21B A3B Thinking", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-03", + "release_date": "2025-03-16", + "last_updated": "2025-03-16", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ "text" @@ -69363,8 +71389,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -69372,121 +71398,103 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "llama-prompt-guard-2-22m", + "name": "Meta Llama Prompt Guard 2 22M", + "display_name": "Meta Llama Prompt Guard 2 22M", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 512, + "output": 2 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-10", + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" - } - ] - }, - "submodel": { - "id": "submodel", - "name": "submodel", - "display_name": "submodel", - "api": "https://llm.submodel.ai/v1", - "doc": "https://submodel.gitbook.io", - "models": [ + }, { - "id": "zai-org/GLM-4.5-Air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 16400 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "zai-org/GLM-4.5-FP8", - "name": "GLM 4.5 FP8", - "display_name": "GLM 4.5 FP8", + "id": "qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "display_name": "OpenAI: GPT-5 Pro", "modalities": { "input": [ "text" @@ -69496,35 +71504,53 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, "open_weights": false, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "llama-4-maverick", + "name": "Meta Llama 4 Maverick 17B 128E", + "display_name": "Meta Llama 4 Maverick 17B 128E", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -69532,15 +71558,16 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen3 235B A22B Thinking 2507", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -69550,75 +71577,81 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "display_name": "Anthropic: Claude Sonnet 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 75000, - "output": 163840 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": false, "open_weights": false, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "knowledge": "2025-05", + "release_date": "2025-05-14", + "last_updated": "2025-05-14", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "deepseek-tng-r1t2-chimera", + "name": "DeepSeek TNG R1T2 Chimera", + "display_name": "DeepSeek TNG R1T2 Chimera", "modalities": { "input": [ "text" @@ -69628,7 +71661,7 @@ ] }, "limit": { - "context": 75000, + "context": 130000, "output": 163840 }, "temperature": true, @@ -69638,42 +71671,44 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "knowledge": "2025-07", + "release_date": "2025-07-02", + "last_updated": "2025-07-02", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "gemma-3-12b-it", + "name": "Google Gemma 3 12B", + "display_name": "Google Gemma 3 12B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 75000, - "output": 163840 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "gpt-oss-120b", + "name": "OpenAI GPT-OSS 120b", + "display_name": "OpenAI GPT-OSS 120b", "modalities": { "input": [ "text" @@ -69684,7 +71719,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -69698,234 +71733,175 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-23", - "last_updated": "2025-08-23", + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" - } - ] - }, - "neon": { - "id": "neon", - "name": "Neon", - "display_name": "Neon", - "api": "${NEON_AI_GATEWAY_BASE_URL}/v1", - "doc": "https://neon.com/docs", - "models": [ + }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "o1", + "name": "OpenAI: o1", + "display_name": "OpenAI: o1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "llama-4-scout", + "name": "Meta Llama 4 Scout 17B 16E", + "display_name": "Meta Llama 4 Scout 17B 16E", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gemini-3-5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "llama-3.1-8b-instruct-turbo", + "name": "Meta Llama 3.1 8B Instruct Turbo", + "display_name": "Meta Llama 3.1 8B Instruct Turbo", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2024-07", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gemini-2-5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "claude-3.5-sonnet-v2", + "name": "Anthropic: Claude 3.5 Sonnet v2", + "display_name": "Anthropic: Claude 3.5 Sonnet v2", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-10", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "gpt-5-4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5-mini", + "name": "OpenAI GPT-5 Mini", + "display_name": "OpenAI GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -69936,30 +71912,29 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "claude-haiku-4-5-20251001", + "name": "Anthropic: Claude 4.5 Haiku (20251001)", + "display_name": "Anthropic: Claude 4.5 Haiku (20251001)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -69971,18 +71946,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -69990,79 +71958,80 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-10", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "mistral-small", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "type": "chat" + }, + { + "id": "deepseek-v3.1-terminus", + "name": "DeepSeek V3.1 Terminus", + "display_name": "DeepSeek V3.1 Terminus", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-09", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "gpt-5-4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "gpt-5.1", + "name": "OpenAI GPT-5.1", + "display_name": "OpenAI GPT-5.1", "modalities": { "input": [ "text", @@ -70093,8 +72062,7 @@ "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -70105,17 +72073,17 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -70125,70 +72093,68 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "gemini-3-1-pro", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "gemma2-9b-it", + "name": "Google Gemma 2", + "display_name": "Google Gemma 2", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2024-06", + "release_date": "2024-06-25", + "last_updated": "2024-06-25", "type": "chat" }, { - "id": "gemini-3-flash", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "gemini-2.5-pro", + "name": "Google Gemini 2.5 Pro", + "display_name": "Google Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -70208,14 +72174,14 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ @@ -70223,17 +72189,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2025-06", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5-1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "grok-4-1-fast-non-reasoning", + "name": "xAI Grok 4.1 Fast Non-Reasoning", + "display_name": "xAI Grok 4.1 Fast Non-Reasoning", "modalities": { "input": [ "text", @@ -70245,47 +72211,25 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 2000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-11", + "release_date": "2025-11-17", + "last_updated": "2025-11-17", "type": "chat" }, { - "id": "gpt-5-1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "gpt-5.1-codex", + "name": "OpenAI: GPT-5.1 Codex", + "display_name": "OpenAI: GPT-5.1 Codex", "modalities": { "input": [ "text", @@ -70327,22 +72271,49 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "llama-3.1-8b-instruct", + "name": "Meta Llama 3.1 8B Instruct", + "display_name": "Meta Llama 3.1 8B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-07", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "display_name": "Anthropic: Claude Opus 4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -70379,25 +72350,24 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2025-05-14", + "last_updated": "2025-05-14", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "gpt-5-nano", + "name": "OpenAI GPT-5 Nano", + "display_name": "OpenAI GPT-5 Nano", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { @@ -70431,24 +72401,23 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gemini-3-1-flash-lite", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "gemini-3-pro-preview", + "name": "Google Gemini 3 Pro Preview", + "display_name": "Google Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", - "video", "audio", - "pdf" + "video" ], "output": [ "text" @@ -70464,30 +72433,46 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2025-11", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "gemini-2.5-flash-lite", + "name": "Google Gemini 2.5 Flash Lite", + "display_name": "Google Gemini 2.5 Flash Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -70501,67 +72486,56 @@ "default_enabled": false, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, "unit": "tokens" }, - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-07", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "gpt-5-4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "o3", + "name": "OpenAI o3", + "display_name": "OpenAI o3", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -70569,81 +72543,86 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "gemini-3-pro", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "llama-prompt-guard-2-86m", + "name": "Meta Llama Prompt Guard 2 86M", + "display_name": "Meta Llama Prompt Guard 2 86M", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 512, + "output": 2 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2024-10", + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" }, { - "id": "gpt-5-3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "gpt-4.1", + "name": "OpenAI GPT-4.1", + "display_name": "OpenAI GPT-4.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "o4-mini", + "name": "OpenAI o4 Mini", + "display_name": "OpenAI o4 Mini", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -70658,13 +72637,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -70672,17 +72644,17 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "llama-4-maverick", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "claude-3-haiku-20240307", + "name": "Anthropic: Claude 3 Haiku", + "display_name": "Anthropic: Claude 3 Haiku", "modalities": { "input": [ "text", @@ -70693,77 +72665,53 @@ ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 200000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "attachment": false, + "open_weights": false, + "knowledge": "2024-03", + "release_date": "2024-03-07", + "last_updated": "2024-03-07", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "grok-3-mini", + "name": "xAI Grok 3 Mini", + "display_name": "xAI Grok 3 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "meta-llama-3-3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "o1-mini", + "name": "OpenAI: o1-mini", + "display_name": "OpenAI: o1-mini", "modalities": { "input": [ "text" @@ -70774,24 +72722,39 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 65536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "kimi-k2-0905", + "name": "Kimi K2 (09/05)", + "display_name": "Kimi K2 (09/05)", "modalities": { "input": [ "text" @@ -70801,120 +72764,106 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "qwen35-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "gpt-4.1-mini-2025-04-14", + "name": "OpenAI GPT-4.1 Mini", + "display_name": "OpenAI GPT-4.1 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 64000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "meta-llama-3-1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "qwen3-coder", + "name": "Qwen3 Coder 480B A35B Instruct Turbo", + "display_name": "Qwen3 Coder 480B A35B Instruct Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 262144, "output": 16384 }, "temperature": true, @@ -70923,21 +72872,20 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": false, + "knowledge": "2025-07", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "gpt-5-2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "gpt-5.1-chat-latest", + "name": "OpenAI GPT-5.1 Chat", + "display_name": "OpenAI GPT-5.1 Chat", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text", @@ -70945,429 +72893,402 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "claude-opus-4-1-20250805", + "name": "Anthropic: Claude Opus 4.1 (20250805)", + "display_name": "Anthropic: Claude Opus 4.1 (20250805)", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "grok-3", + "name": "xAI Grok 3", + "display_name": "xAI Grok 3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "attachment": false, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", + "type": "chat" + }, + { + "id": "sonar-reasoning", + "name": "Perplexity Sonar Reasoning", + "display_name": "Perplexity Sonar Reasoning", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 127000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-01", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" }, { - "id": "gemini-2-5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "qwen3-235b-a22b-thinking", + "name": "Qwen3 235B A22B Thinking", + "display_name": "Qwen3 235B A22B Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 81920 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "gpt-5-2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "llama-guard-4", + "name": "Meta Llama Guard 4 12B", + "display_name": "Meta Llama Guard 4 12B", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 1024 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gpt-5-1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "sonar-reasoning-pro", + "name": "Perplexity Sonar Reasoning Pro", + "display_name": "Perplexity Sonar Reasoning Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ + "text" + ] + }, + "limit": { + "context": 127000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", + "type": "chat" + } + ] + }, + "alibaba-coding-plan": { + "id": "alibaba-coding-plan", + "name": "Alibaba Coding Plan", + "display_name": "Alibaba Coding Plan", + "api": "https://coding-intl.dashscope.aliyuncs.com/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "models": [ + { + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", + "modalities": { + "input": [ "text", - "image" + "image", + "video" + ], + "output": [ + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "gemma-3-12b", - "name": "Gemma 3 12B", - "display_name": "Gemma 3 12B", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 202752, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" - } - ] - }, - "ambient": { - "id": "ambient", - "name": "Ambient", - "display_name": "Ambient", - "api": "https://api.ambient.xyz/v1", - "doc": "https://ambient.xyz", - "models": [ + }, { - "id": "zai-org/GLM-5.1-FP8", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -71386,16 +73307,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "zai-org/GLM-5.2-FP8", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -71405,8 +73327,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -71414,16 +73336,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "ambient/large", - "name": "Ambient Large", - "display_name": "Ambient Large", + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -71433,25 +73360,25 @@ ] }, "limit": { - "context": 101376, - "output": 101376 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -71461,8 +73388,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -71483,47 +73410,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" - }, - { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -71533,42 +73428,47 @@ ] }, "limit": { - "context": 101376, - "output": 101376 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 196608, + "output": 24576 }, "temperature": true, "tool_call": true, @@ -71587,17 +73487,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", @@ -71609,8 +73508,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -71620,25 +73519,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "stepfun/step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -71646,45 +73548,36 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" - } - ] - }, - "dinference": { - "id": "dinference", - "name": "DInference", - "display_name": "DInference", - "api": "https://api.dinference.com/v1", - "doc": "https://dinference.com", - "models": [ + }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -71704,15 +73597,25 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "submodel": { + "id": "submodel", + "name": "submodel", + "display_name": "submodel", + "api": "https://llm.submodel.ai/v1", + "doc": "https://submodel.gitbook.io", + "models": [ { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "zai-org/GLM-4.5-Air", + "name": "GLM 4.5 Air", + "display_name": "GLM 4.5 Air", "modalities": { "input": [ "text" @@ -71722,36 +73625,24 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "zai-org/GLM-4.5-FP8", + "name": "GLM 4.5 FP8", + "display_name": "GLM 4.5 FP8", "modalities": { "input": [ "text" @@ -71761,8 +73652,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -71770,27 +73661,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ "text" @@ -71800,37 +73680,24 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": false, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -71840,29 +73707,24 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08", - "last_updated": "2025-08", + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ "text" @@ -71872,8 +73734,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -71883,40 +73745,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" - } - ] - }, - "privatemode-ai": { - "id": "privatemode-ai", - "name": "Privatemode AI", - "display_name": "Privatemode AI", - "api": "http://localhost:8080/v1", - "doc": "https://docs.privatemode.ai/api/overview", - "models": [ + }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 75000, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -71926,75 +73784,80 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "attachment": false, + "open_weights": false, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" }, { - "id": "whisper-large-v3", - "name": "Whisper large-v3", - "display_name": "Whisper large-v3", + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 75000, + "output": 163840 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-09", - "release_date": "2023-09-01", - "last_updated": "2023-09-01", + "attachment": false, + "open_weights": false, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" }, { - "id": "voxtral-mini-3b", - "name": "Voxtral Mini 3B", - "display_name": "Voxtral Mini 3B", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 75000, + "output": 163840 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-07", - "last_updated": "2025-07", + "attachment": false, + "open_weights": false, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -72004,8 +73867,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -72020,115 +73883,140 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-08-04", - "last_updated": "2025-08-14", + "release_date": "2025-08-23", + "last_updated": "2025-08-23", "type": "chat" - }, - { - "id": "qwen3-embedding-4b", - "name": "Qwen3-Embedding 4B", - "display_name": "Qwen3-Embedding 4B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 2560 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-06-06", - "last_updated": "2025-06-06", - "type": "embedding" } ] }, - "unorouter": { - "id": "unorouter", - "name": "UnoRouter", - "display_name": "UnoRouter", - "api": "https://api.unorouter.com/v1", - "doc": "https://unorouter.com/models", + "neon": { + "id": "neon", + "name": "Neon", + "display_name": "Neon", + "api": "${NEON_AI_GATEWAY_BASE_URL}/v1", + "doc": "https://neon.com/docs", "models": [ { - "id": "step-3.7-flash:free", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "nemotron-3-ultra-550b-a55b:free", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5.5:free", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gemini-3-5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -72136,10 +74024,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -72147,21 +74035,21 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "gemini-2-5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "video", "audio", + "video", "pdf" ], "output": [ @@ -72178,109 +74066,124 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gpt-5-4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { @@ -72341,55 +74244,73 @@ "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5-4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -72402,21 +74323,22 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gemini-3-1-pro", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -72424,10 +74346,43 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", + "type": "chat" + }, + { + "id": "gemini-3-flash", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -72437,13 +74392,63 @@ "reasoning": { "supported": true, "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "type": "chat" + }, + { + "id": "gpt-5-1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -72456,137 +74461,186 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen3.5-397b-a17b:free", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gpt-5-1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek-v4-flash:free", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "glm-4.5-flash:free", - "name": "GLM-4.5-Flash", - "display_name": "GLM-4.5-Flash", + "id": "gemini-3-1-flash-lite", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -72594,17 +74648,17 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -72616,10 +74670,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -72629,42 +74683,42 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "gpt-5-4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { @@ -72702,18 +74756,20 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "gemini-3-pro", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -72721,47 +74777,43 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "gpt-5.4:free", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5-3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -72769,11 +74821,12 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -72782,20 +74835,42 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "glm-5.2:free", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "llama-4-maverick", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -72803,24 +74878,24 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -72832,31 +74907,47 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "minimax-m2.7:free", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "meta-llama-3-3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -72866,25 +74957,25 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "deepseek-v4-pro:free", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -72894,8 +74985,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -72903,21 +74994,24 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemma-4-31b-it:free", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "qwen35-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -72925,7 +75019,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 8000 }, "temperature": true, "tool_call": true, @@ -72933,95 +75027,78 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" - } - ] - }, - "frogbot": { - "id": "frogbot", - "name": "FrogBot", - "display_name": "FrogBot", - "api": "https://app.frogbot.ai/api/v1", - "doc": "https://docs.frogbot.ai", - "models": [ + }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "meta-llama-3-1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 131072, "output": 16384 }, "temperature": true, @@ -73029,17 +75106,17 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "gpt-5-2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -73047,68 +75124,67 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -73118,33 +75194,34 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-07-17", - "last_updated": "2025-07-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -73156,10 +75233,10 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -73169,53 +75246,54 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi-K2.6", - "display_name": "Kimi-K2.6", + "id": "gemini-2-5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -73223,63 +75301,83 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-5-4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "gpt-5-2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { @@ -73316,26 +75414,79 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "zai-glm-5-1", - "name": "Z.AI GLM-5.1", - "display_name": "Z.AI GLM-5.1", + "id": "gpt-5-1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" + }, + { + "id": "gemma-3-12b", + "name": "Gemma 3 12B", + "display_name": "Gemma 3 12B", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -73344,15 +75495,15 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-01-20", - "last_updated": "2025-02-22", + "knowledge": "2024-08-31", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -73368,24 +75519,28 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" - }, + } + ] + }, + "infomaniak": { + "id": "infomaniak", + "name": "Infomaniak", + "display_name": "Infomaniak", + "api": "https://api.infomaniak.com/2/ai/${INFOMANIAK_PRODUCT_ID}/openai/v1", + "doc": "https://www.infomaniak.com/en/hosting/ai-services/open-source-models", + "models": [ { - "id": "minimax-m2-5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "mini_lm_l12_v2", + "name": "All-MiniLM-L12-v2", + "display_name": "All-MiniLM-L12-v2", "modalities": { "input": [ "text" @@ -73395,25 +75550,24 @@ ] }, "limit": { - "context": 192000, - "output": 8192 + "context": 128, + "output": 384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-01-15", - "last_updated": "2025-02-22", + "attachment": false, + "open_weights": true, + "release_date": "2021-08-30", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "minimax-m2-7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "bge_multilingual_gemma2", + "name": "BGE Multilingual Gemma2", + "display_name": "BGE Multilingual Gemma2", "modalities": { "input": [ "text" @@ -73423,25 +75577,24 @@ ] }, "limit": { - "context": 192000, - "output": 8192 + "context": 8000, + "output": 3584 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": false, + "open_weights": true, + "release_date": "2024-07-25", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "grok-code-fast-1", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8", + "name": "Nemotron 3 Nano 30B A3B FP8", + "display_name": "Nemotron 3 Nano 30B A3B FP8", "modalities": { "input": [ "text" @@ -73451,8 +75604,8 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1000000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -73462,35 +75615,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "open_weights": true, + "release_date": "2025-12-15", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 100000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -73500,47 +75649,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "qwen-3-6-plus", - "name": "Qwen 3.6 Plus", - "display_name": "Qwen 3.6 Plus", + "id": "mistralai/Mistral-Small-4-119B-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -73548,16 +75681,23 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-03", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "gpt-5-4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "mistralai/Ministral-3-14B-Instruct-2512", + "name": "Ministral 3 14B Instruct", + "display_name": "Ministral 3 14B Instruct", "modalities": { "input": [ "text", @@ -73568,100 +75708,65 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 100000, + "output": 25600 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek v4 Pro", - "display_name": "DeepSeek v4 Pro", + "id": "swiss-ai/Apertus-v1.5-70B", + "name": "Apertus v1.5 70B", + "display_name": "Apertus v1.5 70B", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 100000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": true, + "release_date": "2026-07-24", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "grok-4-3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "Qwen/Qwen3.5-397B-A17B-FP8", + "name": "Qwen3.5 397B-A17B FP8", + "display_name": "Qwen3.5 397B-A17B FP8", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -73669,17 +75774,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2024-11", - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "Qwen/Qwen3.5-122B-A10B-FP8", + "name": "Qwen3.5 122B-A10B FP8", + "display_name": "Qwen3.5 122B-A10B FP8", "modalities": { "input": [ "text", @@ -73690,8 +75805,8 @@ ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 200000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -73701,20 +75816,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-25", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "gpt-5-3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -73725,10 +75845,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -73737,35 +75857,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-08-01", "type": "chat" - }, + } + ] + }, + "ambient": { + "id": "ambient", + "name": "Ambient", + "display_name": "Ambient", + "api": "https://api.ambient.xyz/v1", + "doc": "https://ambient.xyz", + "models": [ { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "zai-org/GLM-5.1-FP8", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ "text" @@ -73775,8 +75889,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -73786,34 +75900,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "zai-org/GLM-5.2-FP8", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -73821,137 +75937,95 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-03-20", - "last_updated": "2025-06-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "ambient/large", + "name": "Ambient Large", + "display_name": "Ambient Large", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-25", - "last_updated": "2025-11-25", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-3-1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -73959,77 +76033,54 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - } - ] - }, - "the-grid-ai": { - "id": "the-grid-ai", - "name": "The Grid AI", - "display_name": "The Grid AI", - "api": "https://api.thegrid.ai/v1", - "doc": "https://thegrid.ai/docs", - "models": [ + }, { - "id": "agent-standard", - "name": "Agent Standard", - "display_name": "Agent Standard", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -74039,8 +76090,8 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -74050,36 +76101,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-15", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "text-prime", - "name": "Text Prime", - "display_name": "Text Prime", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 30000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -74098,27 +76144,30 @@ ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-07-15", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "agent-prime", - "name": "Agent Prime", - "display_name": "Agent Prime", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 30000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -74128,25 +76177,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-15", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "code-standard", - "name": "Code Standard", - "display_name": "Code Standard", + "id": "stepfun/step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", + "type": "chat" + } + ] + }, + "dinference": { + "id": "dinference", + "name": "DInference", + "display_name": "DInference", + "api": "https://api.dinference.com/v1", + "doc": "https://dinference.com", + "models": [ + { + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -74156,8 +76240,8 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -74177,29 +76261,28 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-15", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "code-max", - "name": "Code Max", - "display_name": "Code Max", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -74216,20 +76299,19 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "agent-max", - "name": "Agent Max", - "display_name": "Agent Max", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -74239,7 +76321,7 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -74256,30 +76338,29 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "text-max", - "name": "Text Max", - "display_name": "Text Max", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -74296,16 +76377,17 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "text-standard", - "name": "Text Standard", - "display_name": "Text Standard", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -74315,36 +76397,29 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-07-15", + "open_weights": true, + "release_date": "2025-08", + "last_updated": "2025-08", "type": "chat" }, { - "id": "code-prime", - "name": "Code Prime", - "display_name": "Code Prime", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -74354,8 +76429,8 @@ ] }, "limit": { - "context": 196608, - "output": 30000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -74365,46 +76440,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-15", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" } ] }, - "sap-ai-core": { - "id": "sap-ai-core", - "name": "SAP AI Core", - "display_name": "SAP AI Core", - "doc": "https://help.sap.com/docs/sap-ai-core", + "privatemode-ai": { + "id": "privatemode-ai", + "name": "Privatemode AI", + "display_name": "Privatemode AI", + "api": "http://localhost:8080/v1", + "doc": "https://docs.privatemode.ai/api/overview", "models": [ { - "id": "anthropic--claude-4.5-sonnet", - "name": "anthropic--claude-4.5-sonnet", - "display_name": "anthropic--claude-4.5-sonnet", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -74412,89 +76481,88 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "gpt-4.1-mini", - "display_name": "gpt-4.1-mini", + "id": "whisper-large-v3", + "name": "Whisper large-v3", + "display_name": "Whisper large-v3", "modalities": { "input": [ - "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2023-09", + "release_date": "2023-09-01", + "last_updated": "2023-09-01", "type": "chat" }, { - "id": "nvidia--llama-3.2-nv-embedqa-1b", - "name": "nvidia--llama-3.2-nv-embedqa-1b", - "display_name": "nvidia--llama-3.2-nv-embedqa-1b", + "id": "voxtral-mini-3b", + "name": "Voxtral Mini 3B", + "display_name": "Voxtral Mini 3B", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 32000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "attachment": true, + "open_weights": true, + "release_date": "2025-07", + "last_updated": "2025-07", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "gemini-3.5-flash", - "display_name": "gemini-3.5-flash", + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -74504,80 +76572,70 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-08", + "release_date": "2025-08-04", + "last_updated": "2025-08-14", "type": "chat" }, { - "id": "anthropic--claude-4.8-opus", - "name": "anthropic--claude-4.8-opus", - "display_name": "anthropic--claude-4.8-opus", + "id": "qwen3-embedding-4b", + "name": "Qwen3-Embedding 4B", + "display_name": "Qwen3-Embedding 4B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32000, + "output": 2560 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" - }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2025-06-06", + "last_updated": "2025-06-06", + "type": "embedding" + } + ] + }, + "unorouter": { + "id": "unorouter", + "name": "UnoRouter", + "display_name": "UnoRouter", + "api": "https://api.unorouter.com/v1", + "doc": "https://unorouter.com/models", + "models": [ { - "id": "gemini-2.5-flash", - "name": "gemini-2.5-flash", - "display_name": "gemini-2.5-flash", + "id": "step-3.7-flash:free", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -74585,42 +76643,20 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-04-17", - "last_updated": "2025-06-05", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "anthropic--claude-4.6-opus", - "name": "anthropic--claude-4.6-opus", - "display_name": "anthropic--claude-4.6-opus", + "id": "nemotron-3-ultra-550b-a55b:free", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -74636,17 +76672,16 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "anthropic--claude-4.5-opus", - "name": "anthropic--claude-4.5-opus", - "display_name": "anthropic--claude-4.5-opus", + "id": "gpt-5.5:free", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -74658,10 +76693,10 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -74669,19 +76704,21 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthropic--claude-3.7-sonnet", - "name": "anthropic--claude-3.7-sonnet", - "display_name": "anthropic--claude-3.7-sonnet", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -74689,46 +76726,45 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" ], - "notes": [ - "Anthropic uses thinking budget tokens" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2025-02-24", - "last_updated": "2025-02-24", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "amazon--titan-embed-text", - "name": "amazon--titan-embed-text", - "display_name": "amazon--titan-embed-text", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -74738,80 +76774,166 @@ ] }, "limit": { - "context": 8192, - "output": 1536 + "context": 1000000, + "output": 384000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-04-30", - "last_updated": "2024-04-30", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "gpt-4.1-nano", - "display_name": "gpt-4.1-nano", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "amazon--nova-micro", - "name": "amazon--nova-micro", - "display_name": "amazon--nova-micro", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "amazon--nova-pro", - "name": "amazon--nova-pro", - "display_name": "amazon--nova-pro", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -74823,66 +76945,97 @@ ] }, "limit": { - "context": 300000, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "sonar-deep-research", - "name": "sonar-deep-research", - "display_name": "sonar-deep-research", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-02-01", - "last_updated": "2025-09-01", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "amazon--nova-lite", - "name": "amazon--nova-lite", - "display_name": "amazon--nova-lite", + "id": "qwen3.5-397b-a17b:free", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -74890,16 +77043,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "sonar", - "name": "sonar", - "display_name": "sonar", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -74909,67 +77073,77 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "sonar-pro", - "name": "sonar-pro", - "display_name": "sonar-pro", + "id": "deepseek-v4-flash:free", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic--claude-4.5-haiku", - "name": "anthropic--claude-4.5-haiku", - "display_name": "anthropic--claude-4.5-haiku", + "id": "glm-4.5-flash:free", + "name": "GLM-4.5-Flash", + "display_name": "GLM-4.5-Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -74977,17 +77151,17 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-5.5", - "name": "gpt-5.5", - "display_name": "gpt-5.5", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -75006,15 +77180,16 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", @@ -75031,15 +77206,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-5", - "name": "gpt-5", - "display_name": "gpt-5", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -75057,19 +77232,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -75082,45 +77258,67 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "mistralai--mistral-small", - "name": "mistralai--mistral-small", - "display_name": "mistralai--mistral-small", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5.4", - "name": "gpt-5.4", - "display_name": "gpt-5.4", + "id": "gpt-5.4:free", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -75139,29 +77337,7 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, @@ -75171,9 +77347,9 @@ "type": "chat" }, { - "id": "sap-abap-1", - "name": "sap-abap-1", - "display_name": "sap-abap-1", + "id": "glm-5.2:free", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -75183,24 +77359,25 @@ ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-11-26", - "last_updated": "2025-11-26", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "anthropic--claude-3-opus", - "name": "anthropic--claude-3-opus", - "display_name": "anthropic--claude-3-opus", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -75212,38 +77389,42 @@ ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-08-31", - "release_date": "2024-02-29", - "last_updated": "2024-02-29", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "anthropic--claude-4-opus", - "name": "anthropic--claude-4-opus", - "display_name": "anthropic--claude-4-opus", + "id": "minimax-m2.7:free", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -75251,22 +77432,19 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic--claude-4.7-opus", - "name": "anthropic--claude-4.7-opus", - "display_name": "anthropic--claude-4.7-opus", + "id": "deepseek-v4-pro:free", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -75274,40 +77452,37 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "gemini-3.1-flash-lite", - "display_name": "gemini-3.1-flash-lite", + "id": "gemma-4-31b-it:free", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -75315,36 +77490,40 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "frogbot": { + "id": "frogbot", + "name": "FrogBot", + "display_name": "FrogBot", + "api": "https://app.frogbot.ai/api/v1", + "doc": "https://docs.frogbot.ai", + "models": [ { - "id": "gpt-5.2", - "name": "gpt-5.2", - "display_name": "gpt-5.2", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -75354,48 +77533,53 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" }, { - "id": "anthropic--claude-3-sonnet", - "name": "anthropic--claude-3-sonnet", - "display_name": "anthropic--claude-3-sonnet", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -75404,57 +77588,84 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2023-08-31", - "release_date": "2024-03-04", - "last_updated": "2024-03-04", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "gemini-embedding", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2048, - "output": 1 + "context": 200000, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "gpt-5-mini", - "display_name": "gpt-5-mini", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -75464,34 +77675,33 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2025-07-17", + "last_updated": "2025-07-17", "type": "chat" }, { - "id": "anthropic--claude-4-sonnet", - "name": "anthropic--claude-4-sonnet", - "display_name": "anthropic--claude-4-sonnet", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -75504,70 +77714,94 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "anthropic--claude-3-haiku", - "name": "anthropic--claude-3-haiku", - "display_name": "anthropic--claude-3-haiku", + "id": "kimi-k2-6", + "name": "Kimi-K2.6", + "display_name": "Kimi-K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-08-31", - "release_date": "2024-03-13", - "last_updated": "2024-03-13", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "gemini-2.5-pro", - "display_name": "gemini-2.5-pro", + "id": "kimi-k2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -75578,62 +77812,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-03-25", - "last_updated": "2025-06-05", - "type": "chat" - }, - { - "id": "mistralai--mistral-medium-instruct", - "name": "mistralai--mistral-medium-instruct", - "display_name": "mistralai--mistral-medium-instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "gpt-5-nano", - "display_name": "gpt-5-nano", + "id": "gpt-5-4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -75651,19 +77847,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -75682,61 +77879,37 @@ "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "gemini-2.5-flash-lite", - "display_name": "gemini-2.5-flash-lite", + "id": "zai-glm-5-1", + "name": "Z.AI GLM-5.1", + "display_name": "Z.AI GLM-5.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 198000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-01-20", + "last_updated": "2025-02-22", "type": "chat" }, { - "id": "cohere--command-a-reasoning", - "name": "cohere--command-a-reasoning", - "display_name": "cohere--command-a-reasoning", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -75746,8 +77919,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -75755,30 +77928,32 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "gpt-4.1", - "name": "gpt-4.1", - "display_name": "gpt-4.1", + "id": "minimax-m2-5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 192000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -75787,46 +77962,43 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2024-09", + "release_date": "2025-01-15", + "last_updated": "2025-02-22", "type": "chat" }, { - "id": "anthropic--claude-4.6-sonnet", - "name": "anthropic--claude-4.6-sonnet", - "display_name": "anthropic--claude-4.6-sonnet", + "id": "minimax-m2-7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 192000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2024-09", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", + "id": "grok-code-fast-1", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ "text" @@ -75836,28 +78008,37 @@ ] }, "limit": { - "context": 8191, - "output": 3072 + "context": 256000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "knowledge": "2023-10", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", + "type": "chat" }, { - "id": "anthropic--claude-3.5-sonnet", - "name": "anthropic--claude-3.5-sonnet", - "display_name": "anthropic--claude-3.5-sonnet", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -75865,118 +78046,127 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04-30", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "qwen-3-6-plus", + "name": "Qwen 3.6 Plus", + "display_name": "Qwen 3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8191, - "output": 1536 + "context": 1000000, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - } - ] - }, - "upstage": { - "id": "upstage", - "name": "Upstage", - "display_name": "Upstage", - "api": "https://api.upstage.ai/v1/solar", - "doc": "https://developers.upstage.ai/docs/apis/chat", - "models": [ - { - "id": "solar-pro3", - "name": "solar-pro3", - "display_name": "solar-pro3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-03", "type": "chat" }, { - "id": "solar-mini", - "name": "solar-mini", - "display_name": "solar-mini", + "id": "gpt-5-4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2024-06-12", - "last_updated": "2025-04-22", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "solar-pro2", - "name": "solar-pro2", - "display_name": "solar-pro2", + "id": "deepseek-v4-pro", + "name": "DeepSeek v4 Pro", + "display_name": "DeepSeek v4 Pro", "modalities": { "input": [ "text" @@ -75986,35 +78176,36 @@ ] }, "limit": { - "context": 65536, + "context": 128000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "knowledge": "2026-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "cline-pass": { - "id": "cline-pass", - "name": "ClinePass", - "display_name": "ClinePass", - "api": "https://api.cline.bot/api/v1", - "doc": "https://docs.cline.bot/getting-started/clinepass", - "models": [ + }, { - "id": "cline-pass/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "grok-4-3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -76027,7 +78218,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -76035,33 +78226,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2024-11", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "cline-pass/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 2000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -76071,39 +78258,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "cline-pass/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5-3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -76111,19 +78293,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "cline-pass/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -76133,8 +78332,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -76148,28 +78347,30 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "cline-pass/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76179,109 +78380,135 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-03-20", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "cline-pass/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 512000, + "context": 2000000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "cline-pass/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "cline-pass/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "gemini-3-1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -76290,29 +78517,28 @@ "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-02-18", + "last_updated": "2026-02-18", "type": "chat" }, { - "id": "cline-pass/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 272000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -76322,35 +78548,58 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" - }, + } + ] + }, + "the-grid-ai": { + "id": "the-grid-ai", + "name": "The Grid AI", + "display_name": "The Grid AI", + "api": "https://api.thegrid.ai/v1", + "doc": "https://thegrid.ai/docs", + "models": [ { - "id": "cline-pass/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "agent-standard", + "name": "Agent Standard", + "display_name": "Agent Standard", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -76358,19 +78607,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "cline-pass/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "text-prime", + "name": "Text Prime", + "display_name": "Text Prime", "modalities": { "input": [ "text" @@ -76380,8 +78635,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 196608, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -76389,38 +78644,38 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-07-15", "type": "chat" - } - ] - }, - "regolo-ai": { - "id": "regolo-ai", - "name": "Regolo AI", - "display_name": "Regolo AI", - "api": "https://api.regolo.ai/v1", - "doc": "https://docs.regolo.ai/", - "models": [ + }, { - "id": "qwen3.5-122b", - "name": "Qwen3.5-122B", - "display_name": "Qwen3.5-122B", + "id": "agent-prime", + "name": "Agent Prime", + "display_name": "Agent Prime", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 196608, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -76439,16 +78694,16 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT-OSS-20B", - "display_name": "GPT-OSS-20B", + "id": "code-standard", + "name": "Code Standard", + "display_name": "Code Standard", "modalities": { "input": [ "text" @@ -76459,7 +78714,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 16000 }, "temperature": true, "tool_call": true, @@ -76469,19 +78724,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5-9B", - "display_name": "Qwen3.5-9B", + "id": "code-max", + "name": "Code Max", + "display_name": "Code Max", "modalities": { "input": [ "text", @@ -76492,10 +78753,10 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -76513,97 +78774,95 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "mistral-small3.2", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "agent-max", + "name": "Agent Max", + "display_name": "Agent Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 120000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "release_date": "2026-05-04", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "text-max", + "name": "Text Max", + "display_name": "Text Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2026-02-26", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "qwen3-reranker-4b", - "name": "Qwen3-Reranker-4B", - "display_name": "Qwen3-Reranker-4B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", - "type": "rerank" - }, - { - "id": "gpt-oss-120b", - "name": "GPT-OSS-120B", - "display_name": "GPT-OSS-120B", + "id": "text-standard", + "name": "Text Standard", + "display_name": "Text Standard", "modalities": { "input": [ "text" @@ -76614,7 +78873,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 16000 }, "temperature": true, "tool_call": true, @@ -76624,19 +78883,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-02-26", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax 2.5", - "display_name": "MiniMax 2.5", + "id": "code-prime", + "name": "Code Prime", + "display_name": "Code Prime", "modalities": { "input": [ "text" @@ -76646,8 +78911,8 @@ ] }, "limit": { - "context": 190000, - "output": 64000 + "context": 196608, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -76657,31 +78922,46 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "release_date": "2026-03-10", - "last_updated": "2026-03-10", + "release_date": "2026-05-04", + "last_updated": "2026-07-15", "type": "chat" - }, + } + ] + }, + "sap-ai-core": { + "id": "sap-ai-core", + "name": "SAP AI Core", + "display_name": "SAP AI Core", + "doc": "https://help.sap.com/docs/sap-ai-core", + "models": [ { - "id": "mistral-small-4-119b", - "name": "Mistral Small 4 119B", - "display_name": "Mistral Small 4 119B", + "id": "anthropic--claude-4.5-sonnet", + "name": "anthropic--claude-4.5-sonnet", + "display_name": "anthropic--claude-4.5-sonnet", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -76691,41 +78971,45 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "qwen-image", - "name": "Qwen-Image", - "display_name": "Qwen-Image", + "id": "gpt-4.1-mini", + "name": "gpt-4.1-mini", + "display_name": "gpt-4.1-mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", - "type": "imageGeneration" + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" }, { - "id": "llama-3.1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "nvidia--llama-3.2-nv-embedqa-1b", + "name": "nvidia--llama-3.2-nv-embedqa-1b", + "display_name": "nvidia--llama-3.2-nv-embedqa-1b", "modalities": { "input": [ "text" @@ -76735,35 +79019,39 @@ ] }, "limit": { - "context": 120000, - "output": 120000 + "context": 8192, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-04-07", - "last_updated": "2025-04-07", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3-Coder-Next", - "display_name": "Qwen3-Coder-Next", + "id": "gemini-3.5-flash", + "name": "gemini-3.5-flash", + "display_name": "gemini-3.5-flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76771,56 +79059,72 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen3-embedding-8b", - "name": "Qwen3-Embedding-8B", - "display_name": "Qwen3-Embedding-8B", + "id": "anthropic--claude-4.8-opus", + "name": "anthropic--claude-4.8-opus", + "display_name": "anthropic--claude-4.8-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", - "type": "embedding" - } - ] - }, - "aiand": { - "id": "aiand", - "name": "ai&", - "display_name": "ai&", - "api": "https://api.aiand.com/v1", - "doc": "https://docs.aiand.com/", - "models": [ + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "chat" + }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "gemini-2.5-flash", + "name": "gemini-2.5-flash", + "display_name": "gemini-2.5-flash", "modalities": { "input": [ "text", "image", + "audio", "video", "pdf" ], @@ -76829,8 +79133,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76840,30 +79144,48 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-04-17", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "zai-org/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic--claude-4.6-opus", + "name": "anthropic--claude-4.6-opus", + "display_name": "anthropic--claude-4.6-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -76871,32 +79193,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "anthropic--claude-4.5-opus", + "name": "anthropic--claude-4.5-opus", + "display_name": "anthropic--claude-4.5-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -76904,67 +79224,68 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic--claude-3.7-sonnet", + "name": "anthropic--claude-3.7-sonnet", + "display_name": "anthropic--claude-3.7-sonnet", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": false, + "summaries": false, + "visibility": "full", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic uses thinking budget tokens" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2025-02-24", + "last_updated": "2025-02-24", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "amazon--titan-embed-text", + "name": "amazon--titan-embed-text", + "display_name": "amazon--titan-embed-text", "modalities": { "input": [ "text" @@ -76974,108 +79295,109 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 8192, + "output": 1536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2024-04-30", + "last_updated": "2024-04-30", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gpt-4.1-nano", + "name": "gpt-4.1-nano", + "display_name": "gpt-4.1-nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "amazon--nova-micro", + "name": "amazon--nova-micro", + "display_name": "amazon--nova-micro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "amazon--nova-pro", + "name": "amazon--nova-pro", + "display_name": "amazon--nova-pro", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 300000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "sonar-deep-research", + "name": "sonar-deep-research", + "display_name": "sonar-deep-research", "modalities": { "input": [ "text" @@ -77085,39 +79407,26 @@ ] }, "limit": { - "context": 131072, + "context": 128000, "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-02-01", + "last_updated": "2025-09-01", "type": "chat" - } - ] - }, - "pioneer": { - "id": "pioneer", - "name": "Pioneer", - "display_name": "Pioneer", - "api": "https://api.pioneer.ai/v1", - "doc": "https://agent.pioneer.ai/llms.txt", - "models": [ + }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "amazon--nova-lite", + "name": "amazon--nova-lite", + "display_name": "amazon--nova-lite", "modalities": { "input": [ "text", @@ -77130,7 +79439,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -77138,87 +79447,44 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "sonar", + "name": "sonar", + "display_name": "sonar", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "mistral-medium-3.5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "sonar-pro", + "name": "sonar-pro", + "display_name": "sonar-pro", "modalities": { "input": [ "text", @@ -77229,36 +79495,25 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 200000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "anthropic--claude-4.5-haiku", + "name": "anthropic--claude-4.5-haiku", + "display_name": "anthropic--claude-4.5-haiku", "modalities": { "input": [ "text", @@ -77270,8 +79525,8 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -77279,28 +79534,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "gpt-5.5", + "name": "gpt-5.5", + "display_name": "gpt-5.5", "modalities": { "input": [ "text", @@ -77312,10 +79556,10 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -77324,42 +79568,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "gpt-5", + "name": "gpt-5", + "display_name": "gpt-5", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -77369,85 +79620,64 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ "minimal", "low", "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "mistralai--mistral-small", + "name": "mistralai--mistral-small", + "display_name": "mistralai--mistral-small", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "gpt-5.4", + "name": "gpt-5.4", + "display_name": "gpt-5.4", "modalities": { "input": [ "text", @@ -77459,10 +79689,10 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -77472,92 +79702,62 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gemini-3.1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "sap-abap-1", + "name": "sap-abap-1", + "display_name": "sap-abap-1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-11-26", + "last_updated": "2025-11-26", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "anthropic--claude-3-opus", + "name": "anthropic--claude-3-opus", + "display_name": "anthropic--claude-3-opus", "modalities": { "input": [ "text", @@ -77569,64 +79769,38 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2023-08-31", + "release_date": "2024-02-29", + "last_updated": "2024-02-29", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "anthropic--claude-4-opus", + "name": "anthropic--claude-4-opus", + "display_name": "anthropic--claude-4-opus", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -77634,31 +79808,22 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "anthropic--claude-4.7-opus", + "name": "anthropic--claude-4.7-opus", + "display_name": "anthropic--claude-4.7-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -77666,35 +79831,25 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gemini-3-flash", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "gemini-3.1-flash-lite", + "name": "gemini-3.1-flash-lite", + "display_name": "gemini-3.1-flash-lite", "modalities": { "input": [ "text", @@ -77709,7 +79864,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -77719,62 +79874,47 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gpt-5.2", + "name": "gpt-5.2", + "display_name": "gpt-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", @@ -77786,25 +79926,20 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "anthropic--claude-3-sonnet", + "name": "anthropic--claude-3-sonnet", + "display_name": "anthropic--claude-3-sonnet", "modalities": { "input": [ "text", @@ -77817,140 +79952,103 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-08-31", + "release_date": "2024-03-04", + "last_updated": "2024-03-04", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "gemini-embedding", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 2048, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "gpt-5-mini", + "name": "gpt-5-mini", + "display_name": "gpt-5-mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "anthropic--claude-4-sonnet", + "name": "anthropic--claude-4-sonnet", + "display_name": "anthropic--claude-4-sonnet", "modalities": { "input": [ "text", @@ -77962,224 +80060,137 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "anthropic--claude-3-haiku", + "name": "anthropic--claude-3-haiku", + "display_name": "anthropic--claude-3-haiku", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 128000 + "context": 200000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2023-08-31", + "release_date": "2024-03-13", + "last_updated": "2024-03-13", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "gemini-2.5-pro", + "name": "gemini-2.5-pro", + "display_name": "gemini-2.5-pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2025-03-25", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "mistralai--mistral-medium-instruct", + "name": "mistralai--mistral-medium-instruct", + "display_name": "mistralai--mistral-medium-instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "gpt-5-nano", + "name": "gpt-5-nano", + "display_name": "gpt-5-nano", "modalities": { "input": [ "text", @@ -78217,12 +80228,7 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, @@ -78233,162 +80239,120 @@ "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "gemini-2.5-flash-lite", + "name": "gemini-2.5-flash-lite", + "display_name": "gemini-2.5-flash-lite", "modalities": { "input": [ "text", "image", - "video" + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "cohere--command-a-reasoning", + "name": "cohere--command-a-reasoning", + "display_name": "cohere--command-a-reasoning", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "gpt-4.1", + "name": "gpt-4.1", + "display_name": "gpt-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "anthropic--claude-4.6-sonnet", + "name": "anthropic--claude-4.6-sonnet", + "display_name": "anthropic--claude-4.6-sonnet", "modalities": { "input": [ "text", @@ -78401,51 +80365,52 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-08", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8191, + "output": 3072 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" + }, + { + "id": "anthropic--claude-3.5-sonnet", + "name": "anthropic--claude-3.5-sonnet", + "display_name": "anthropic--claude-3.5-sonnet", "modalities": { "input": [ "text", @@ -78458,52 +80423,24 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2024-04-30", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ "text" @@ -78513,8 +80450,44 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 8191, + "output": 1536 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" + } + ] + }, + "upstage": { + "id": "upstage", + "name": "Upstage", + "display_name": "Upstage", + "api": "https://api.upstage.ai/v1/solar", + "doc": "https://developers.upstage.ai/docs/apis/chat", + "models": [ + { + "id": "solar-pro3", + "name": "solar-pro3", + "display_name": "solar-pro3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -78522,41 +80495,56 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": false, + "knowledge": "2025-03", + "release_date": "2026-01", + "last_updated": "2026-01", + "type": "chat" + }, + { + "id": "solar-mini", + "name": "solar-mini", + "display_name": "solar-mini", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2024-09", + "release_date": "2024-06-12", + "last_updated": "2025-04-22", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "solar-pro2", + "name": "solar-pro2", + "display_name": "solar-pro2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -78564,28 +80552,26 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-03", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" - }, + } + ] + }, + "cline-pass": { + "id": "cline-pass", + "name": "ClinePass", + "display_name": "ClinePass", + "api": "https://api.cline.bot/api/v1", + "doc": "https://docs.cline.bot/getting-started/clinepass", + "models": [ { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "cline-pass/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -78598,7 +80584,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -78608,26 +80594,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "cline-pass/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -78638,7 +80618,7 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -78659,14 +80639,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "cline-pass/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -78677,7 +80658,7 @@ }, "limit": { "context": 1000000, - "output": 65000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -78687,25 +80668,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "cline-pass/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -78715,8 +80690,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -78726,36 +80701,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "google/gemma-4-12B-it", - "name": "Gemma 4 12B IT", - "display_name": "Gemma 4 12B IT", + "id": "cline-pass/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -78765,36 +80736,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-31", - "last_updated": "2026-05-31", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemma-3-4b-pt", - "name": "Gemma 3 4B (Pretrained)", - "display_name": "Gemma 3 4B (Pretrained)", + "id": "cline-pass/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 512000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -78804,25 +80772,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-02-28", - "last_updated": "2025-02-28", + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "google/diffusiongemma-26B-A4B-it", - "name": "DiffusionGemma 26B-A4B IT", - "display_name": "DiffusionGemma 26B-A4B IT", + "id": "cline-pass/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -78832,8 +80794,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -78853,28 +80815,30 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-31", - "last_updated": "2026-05-31", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemma-4-E2B-it", - "name": "Gemma 4 E2B IT", - "display_name": "Gemma 4 E2B IT", + "id": "cline-pass/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "audio" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -78882,42 +80846,32 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "google/gemma-4-E4B-it", - "name": "Gemma 4 E4B IT", - "display_name": "Gemma 4 E4B IT", + "id": "cline-pass/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -78925,39 +80879,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "cline-pass/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -78965,25 +80915,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "cline-pass/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ "text" @@ -78994,7 +80938,46 @@ }, "limit": { "context": 1048576, - "output": 128000 + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + } + ] + }, + "regolo-ai": { + "id": "regolo-ai", + "name": "Regolo AI", + "display_name": "Regolo AI", + "api": "https://api.regolo.ai/v1", + "doc": "https://docs.regolo.ai/", + "models": [ + { + "id": "qwen3.5-122b", + "name": "Qwen3.5-122B", + "display_name": "Qwen3.5-122B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -79013,16 +80996,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "gpt-oss-20b", + "name": "GPT-OSS-20B", + "display_name": "GPT-OSS-20B", "modalities": { "input": [ "text" @@ -79032,8 +81015,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -79043,25 +81026,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "qwen3.5-9b", + "name": "Qwen3.5-9B", + "display_name": "Qwen3.5-9B", "modalities": { "input": [ "text", @@ -79072,10 +81049,10 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -79093,15 +81070,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "open_weights": true, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "fastino/gliner2-large-v1", - "name": "GLiNER2 Large", - "display_name": "GLiNER2 Large", + "id": "mistral-small3.2", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text" @@ -79111,24 +81088,25 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 120000, + "output": 120000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", "type": "chat" }, { - "id": "fastino/gliguard-LLMGuardrails-300M", - "name": "GLiGuard LLM Guardrails 300M", - "display_name": "GLiGuard LLM Guardrails 300M", + "id": "llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -79138,8 +81116,8 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -79148,14 +81126,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "fastino/gliner2-multi-v1", - "name": "GLiNER2 Multi", - "display_name": "GLiNER2 Multi", + "id": "qwen3-reranker-4b", + "name": "Qwen3-Reranker-4B", + "display_name": "Qwen3-Reranker-4B", "modalities": { "input": [ "text" @@ -79165,24 +81143,57 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 32768, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", + "type": "rerank" + }, + { + "id": "gpt-oss-120b", + "name": "GPT-OSS-120B", + "display_name": "GPT-OSS-120B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2025-11-30", - "last_updated": "2025-11-30", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "fastino/gliner2-base-v1", - "name": "GLiNER2 Base", - "display_name": "GLiNER2 Base", + "id": "minimax-m2.5", + "name": "MiniMax 2.5", + "display_name": "MiniMax 2.5", "modalities": { "input": [ "text" @@ -79192,57 +81203,65 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 190000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "release_date": "2026-03-10", + "last_updated": "2026-03-10", "type": "chat" }, { - "id": "fastino/gliner2-multi-large-v1", - "name": "GLiNER2 Multi Large", - "display_name": "GLiNER2 Multi Large", + "id": "mistral-small-4-119b", + "name": "Mistral Small 4 119B", + "display_name": "Mistral Small 4 119B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-11-30", - "last_updated": "2025-11-30", + "release_date": "2026-03-15", + "last_updated": "2026-03-15", "type": "chat" }, { - "id": "fastino/gliner2-privacy-filter-PII-multi", - "name": "GLiNER2 Privacy Filter PII (Multi)", - "display_name": "GLiNER2 Privacy Filter PII (Multi)", + "id": "qwen-image", + "name": "Qwen-Image", + "display_name": "Qwen-Image", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { @@ -79250,20 +81269,20 @@ "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", - "type": "chat" + "release_date": "2026-03-01", + "last_updated": "2026-03-01", + "type": "imageGeneration" }, { - "id": "mistralai/Mistral-Nemo-Instruct-2407", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -79273,41 +81292,27 @@ ] }, "limit": { - "context": 131072, - "output": 128000 + "context": 120000, + "output": 120000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": false, + "release_date": "2025-04-07", + "last_updated": "2025-04-07", "type": "chat" }, { - "id": "mistralai/Mistral-Small-4-119B-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "qwen3-coder-next", + "name": "Qwen3-Coder-Next", + "display_name": "Qwen3-Coder-Next", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -79315,7 +81320,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -79323,28 +81328,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "mistralai/Mistral-7B-Instruct-v0.3", - "name": "Mistral 7B Instruct v0.3", - "display_name": "Mistral 7B Instruct v0.3", + "id": "qwen3-embedding-8b", + "name": "Qwen3-Embedding-8B", + "display_name": "Qwen3-Embedding-8B", "modalities": { "input": [ "text" @@ -79355,39 +81348,37 @@ }, "limit": { "context": 32768, - "output": 32768 + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2023-04-30", - "last_updated": "2023-04-30", - "type": "chat" - }, + "open_weights": true, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", + "type": "embedding" + } + ] + }, + "aiand": { + "id": "aiand", + "name": "ai&", + "display_name": "ai&", + "api": "https://api.aiand.com/v1", + "doc": "https://docs.aiand.com/", + "models": [ { - "id": "pioneer/auto", - "name": "Pioneer Auto", - "display_name": "Pioneer Auto", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -79395,8 +81386,8 @@ ] }, "limit": { - "context": 1048576, - "output": 4096 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -79406,38 +81397,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2025-06-29", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "zai-org/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -79447,25 +81430,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/Qwen3-8B", - "name": "Qwen3 8B", - "display_name": "Qwen3 8B", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text" @@ -79475,8 +81452,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -79497,29 +81474,25 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-03-31", - "last_updated": "2025-04-28", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "deepseek-ai/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -79538,16 +81511,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Qwen/Qwen3-1.7B-Base", - "name": "Qwen3 1.7B Base", - "display_name": "Qwen3 1.7B Base", + "id": "deepseek-ai/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -79557,8 +81531,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -79578,21 +81552,21 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2025-03-31", - "last_updated": "2025-03-31", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" @@ -79600,9 +81574,9 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79610,25 +81584,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" + }, + { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -79639,7 +81643,7 @@ }, "limit": { "context": 131072, - "output": 16384 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -79649,37 +81653,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "pioneer": { + "id": "pioneer", + "name": "Pioneer", + "display_name": "Pioneer", + "api": "https://api.pioneer.ai/v1", + "doc": "https://agent.pioneer.ai/llms.txt", + "models": [ { - "id": "Qwen/Qwen3-4B-Instruct-2507", - "name": "Qwen3 4B Instruct", - "display_name": "Qwen3 4B Instruct", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -79698,69 +81706,91 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "Qwen/Qwen3-4B-Base", - "name": "Qwen3 4B Base", - "display_name": "Qwen3 4B Base", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-03-31", - "last_updated": "2025-03-31", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "LiquidAI/LFM2-24B-A2B", - "name": "LFM2 24B A2B", - "display_name": "LFM2 24B A2B", + "id": "mistral-medium-3.5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -79776,26 +81806,28 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-01-31", - "last_updated": "2026-02-25", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "HuggingFaceTB/SmolLM3-3B-Base", - "name": "SmolLM3 3B Base", - "display_name": "SmolLM3 3B Base", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 1047576, "output": 32768 }, "temperature": true, @@ -79815,27 +81847,30 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -79854,29 +81889,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -79887,6 +81925,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -79896,68 +81943,83 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79966,6 +82028,23 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -79974,30 +82053,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -80017,71 +82098,90 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80090,35 +82190,55 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "gemini-3.1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -80129,6 +82249,13 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80137,110 +82264,140 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "claude-3-7-sonnet-latest", + "name": "Claude Sonnet 3.7", + "display_name": "Claude Sonnet 3.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic uses thinking budget tokens" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "meta-llama/Llama-3.1-8B-Instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-06-30", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "meta-llama/Llama-3.2-1B-Instruct", - "name": "Llama 3.2 1B Instruct", - "display_name": "Llama 3.2 1B Instruct", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 60000 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -80256,17 +82413,17 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-31", - "last_updated": "2024-09-25", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "meta-llama/Llama-3.2-3B-Instruct", - "name": "Llama 3.2 3B Instruct", - "display_name": "Llama 3.2 3B Instruct", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -80276,11 +82433,11 @@ ] }, "limit": { - "context": 131072, - "output": 80000 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -80297,27 +82454,30 @@ } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-31", - "last_updated": "2024-09-25", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.5-Pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "gemini-3-flash", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 131072 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -80328,6 +82488,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80336,23 +82505,22 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" @@ -80360,9 +82528,9 @@ }, "limit": { "context": 1050000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80371,6 +82539,21 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80380,176 +82563,230 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - } - ] - }, - "siliconflow-com": { - "id": "siliconflow-com", - "name": "SiliconFlow", - "display_name": "SiliconFlow", - "api": "https://api.siliconflow.com/v1", - "doc": "https://cloud.siliconflow.com/models", - "models": [ + }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "zai-org/GLM-5", - "display_name": "zai-org/GLM-5", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 205000, - "output": 205000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-06-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "zai-org/GLM-4.5-Air", - "name": "zai-org/GLM-4.5-Air", - "display_name": "zai-org/GLM-4.5-Air", + "id": "mistral-large-3", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1049000, - "output": 262000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80558,37 +82795,55 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "zai-org/GLM-5.1", - "display_name": "zai-org/GLM-5.1", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 205000, - "output": 205000 + "context": 1047576, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80597,28 +82852,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "zai-org/GLM-5V-Turbo", - "name": "zai-org/GLM-5V-Turbo", - "display_name": "zai-org/GLM-5V-Turbo", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -80629,6 +82888,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80639,53 +82907,87 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "tencent/Hunyuan-A13B-Instruct", - "name": "tencent/Hunyuan-A13B-Instruct", - "display_name": "tencent/Hunyuan-A13B-Instruct", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-11-25", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "tencent/Hy3-preview", - "name": "Hy3 preview", - "display_name": "Hy3 preview", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -80695,39 +82997,66 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "Qwen/Qwen3.5-27B", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80736,63 +83065,111 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "Qwen/Qwen2.5-7B-Instruct", - "name": "Qwen/Qwen2.5-7B-Instruct", - "display_name": "Qwen/Qwen2.5-7B-Instruct", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 33000, - "output": 4000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-09-18", - "last_updated": "2025-11-25", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen/Qwen3.5-9B", - "display_name": "Qwen/Qwen3.5-9B", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80801,27 +83178,29 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-04-24", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "Qwen/Qwen3-14B", - "name": "Qwen/Qwen3-14B", - "display_name": "Qwen/Qwen3-14B", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 500000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -80840,63 +83219,94 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-30", - "last_updated": "2025-11-25", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "Qwen/Qwen2.5-72B-Instruct", - "name": "Qwen/Qwen2.5-72B-Instruct", - "display_name": "Qwen/Qwen2.5-72B-Instruct", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 33000, - "output": 4000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-09-18", - "last_updated": "2025-11-25", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "Qwen/Qwen3.5-122B-A10B", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80905,84 +83315,145 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-08-01", - "last_updated": "2025-11-25", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "display_name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-04", - "last_updated": "2025-11-25", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "Qwen/Qwen3-8B", - "name": "Qwen/Qwen3-8B", - "display_name": "Qwen/Qwen3-8B", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80991,6 +83462,23 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -80999,70 +83487,94 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-30", - "last_updated": "2025-11-25", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -81075,16 +83587,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -81095,12 +83608,13 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -81115,70 +83629,62 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "display_name": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "id": "devstral-2", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-04", - "last_updated": "2025-11-25", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -81191,30 +83697,32 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "display_name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -81233,42 +83741,57 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-10-11", - "last_updated": "2025-11-25", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-8B-Instruct", - "name": "Qwen/Qwen3-VL-8B-Instruct", - "display_name": "Qwen/Qwen3-VL-8B-Instruct", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-11-25", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "display_name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -81278,24 +83801,36 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "display_name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -81305,80 +83840,75 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-31", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-32B-Instruct", - "name": "Qwen/Qwen3-VL-32B-Instruct", - "display_name": "Qwen/Qwen3-VL-32B-Instruct", + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 262000, - "output": 262000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-05", - "last_updated": "2025-11-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen/Qwen3-32B", - "display_name": "Qwen/Qwen3-32B", + "id": "google/gemma-4-12B-it", + "name": "Gemma 4 12B IT", + "display_name": "Gemma 4 12B IT", "modalities": { "input": [ "text" @@ -81388,8 +83918,8 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -81410,26 +83940,25 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-04-30", - "last_updated": "2025-11-25", + "release_date": "2026-05-31", + "last_updated": "2026-05-31", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-32B-Thinking", - "name": "Qwen/Qwen3-VL-32B-Thinking", - "display_name": "Qwen/Qwen3-VL-32B-Thinking", + "id": "google/gemma-3-4b-pt", + "name": "Gemma 3 4B (Pretrained)", + "display_name": "Gemma 3 4B (Pretrained)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -81448,16 +83977,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", + "release_date": "2025-02-28", + "last_updated": "2025-02-28", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "display_name": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "id": "google/diffusiongemma-26B-A4B-it", + "name": "DiffusionGemma 26B-A4B IT", + "display_name": "DiffusionGemma 26B-A4B IT", "modalities": { "input": [ "text" @@ -81467,8 +83996,8 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81489,105 +84018,136 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", + "release_date": "2026-05-31", + "last_updated": "2026-05-31", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMaxAI/MiniMax-M2.5", - "display_name": "MiniMaxAI/MiniMax-M2.5", + "id": "google/gemma-4-E2B-it", + "name": "Gemma 4 E2B IT", + "display_name": "Gemma 4 E2B IT", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 197000, - "output": 131000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-15", - "last_updated": "2026-06-15", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "inclusionAI/Ling-flash-2.0", - "name": "inclusionAI/Ling-flash-2.0", - "display_name": "inclusionAI/Ling-flash-2.0", + "id": "google/gemma-4-E4B-it", + "name": "Gemma 4 E4B IT", + "display_name": "Gemma 4 E4B IT", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-18", - "last_updated": "2025-11-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-04", - "last_updated": "2025-11-25", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3", - "name": "deepseek-ai/DeepSeek-V3", - "display_name": "deepseek-ai/DeepSeek-V3", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -81597,24 +84157,36 @@ ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 1048576, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-26", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "deepseek-ai/DeepSeek-R1", - "display_name": "deepseek-ai/DeepSeek-R1", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -81624,8 +84196,8 @@ ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81645,28 +84217,29 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-28", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "deepseek-ai/DeepSeek-V3.2", - "display_name": "deepseek-ai/DeepSeek-V3.2", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -81674,19 +84247,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-12-03", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2-Exp", - "name": "deepseek-ai/DeepSeek-V3.2-Exp", - "display_name": "deepseek-ai/DeepSeek-V3.2-Exp", + "id": "fastino/gliner2-large-v1", + "name": "GLiNER2 Large", + "display_name": "GLiNER2 Large", "modalities": { "input": [ "text" @@ -81696,25 +84275,24 @@ ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-10-10", - "last_updated": "2025-11-25", + "release_date": "2025-06-30", + "last_updated": "2025-06-30", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "deepseek-ai/DeepSeek-V3.1", - "display_name": "deepseek-ai/DeepSeek-V3.1", + "id": "fastino/gliguard-LLMGuardrails-300M", + "name": "GLiGuard LLM Guardrails 300M", + "display_name": "GLiGuard LLM Guardrails 300M", "modalities": { "input": [ "text" @@ -81724,25 +84302,24 @@ ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-08-25", - "last_updated": "2025-11-25", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "fastino/gliner2-multi-v1", + "name": "GLiNER2 Multi", + "display_name": "GLiNER2 Multi", "modalities": { "input": [ "text" @@ -81752,37 +84329,24 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2025-11-30", + "last_updated": "2025-11-30", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "fastino/gliner2-base-v1", + "name": "GLiNER2 Base", + "display_name": "GLiNER2 Base", "modalities": { "input": [ "text" @@ -81792,37 +84356,24 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "deepseek-ai/DeepSeek-V3.1-Terminus", - "display_name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "id": "fastino/gliner2-multi-large-v1", + "name": "GLiNER2 Multi Large", + "display_name": "GLiNER2 Multi Large", "modalities": { "input": [ "text" @@ -81832,25 +84383,24 @@ ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-11-25", + "release_date": "2025-11-30", + "last_updated": "2025-11-30", "type": "chat" }, { - "id": "stepfun-ai/Step-3.5-Flash", - "name": "stepfun-ai/Step-3.5-Flash", - "display_name": "stepfun-ai/Step-3.5-Flash", + "id": "fastino/gliner2-privacy-filter-PII-multi", + "name": "GLiNER2 Privacy Filter PII (Multi)", + "display_name": "GLiNER2 Privacy Filter PII (Multi)", "modalities": { "input": [ "text" @@ -81860,37 +84410,35 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "moonshotai/Kimi-K2.6", - "display_name": "moonshotai/Kimi-K2.6", + "id": "mistralai/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 131072, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -81911,14 +84459,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-21", - "last_updated": "2026-06-15", + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "moonshotai/Kimi-K2.5", - "display_name": "moonshotai/Kimi-K2.5", + "id": "mistralai/Mistral-Small-4-119B-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", @@ -81929,8 +84478,8 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -81949,16 +84498,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "openai/gpt-oss-20b", - "display_name": "openai/gpt-oss-20b", + "id": "mistralai/Codestral-22B-v0.1", + "name": "Codestral-22B-v0.1", + "display_name": "Codestral-22B-v0.1", "modalities": { "input": [ "text" @@ -81968,29 +84518,24 @@ ] }, "limit": { - "context": 131000, - "output": 8000 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-13", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2024-05-29", + "last_updated": "2024-05-29", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "openai/gpt-oss-120b", - "display_name": "openai/gpt-oss-120b", + "id": "mistralai/Magistral-Small-2506", + "name": "Magistral Small", + "display_name": "Magistral Small", "modalities": { "input": [ "text" @@ -82000,8 +84545,8 @@ ] }, "limit": { - "context": 131000, - "output": 8000 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -82011,19 +84556,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-13", - "last_updated": "2025-11-25", + "open_weights": true, + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "baidu/ERNIE-4.5-300B-A47B", - "name": "baidu/ERNIE-4.5-300B-A47B", - "display_name": "baidu/ERNIE-4.5-300B-A47B", + "id": "mistralai/Mistral-7B-Instruct-v0.3", + "name": "Mistral 7B Instruct v0.3", + "display_name": "Mistral 7B Instruct v0.3", "modalities": { "input": [ "text" @@ -82033,139 +84584,92 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-07-02", - "last_updated": "2025-11-25", + "release_date": "2023-04-30", + "last_updated": "2023-04-30", "type": "chat" - } - ] - }, - "ai-router": { - "id": "ai-router", - "name": "AI-ROUTER", - "display_name": "AI-ROUTER", - "api": "https://api.ai-router.dev/v1", - "doc": "https://ai-router.dev/openai-compatible-api-gateway/", - "models": [ + }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "mistralai/Ministral-8B-Instruct-2410", + "name": "Ministral 8B Instruct", + "display_name": "Ministral 8B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2024-10-16", + "last_updated": "2024-10-16", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "mistralai/Pixtral-12B-2409", + "name": "Pixtral 12B", + "display_name": "Pixtral 12B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2024-09-01", + "last_updated": "2024-09-01", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "pioneer/auto", + "name": "Pioneer Auto", + "display_name": "Pioneer Auto", "modalities": { "input": [ "text", @@ -82177,63 +84681,52 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2024-01-01", + "last_updated": "2025-06-29", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", "image", - "pdf" + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -82242,52 +84735,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", + "release_date": "2026-04-08", "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -82296,132 +84776,133 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" - } - ] - }, - "inference": { - "id": "inference", - "name": "Inference", - "display_name": "Inference", - "api": "https://inference.net/v1", - "doc": "https://inference.net/models", - "models": [ + }, { - "id": "google/gemma-3", - "name": "Google Gemma 3", - "display_name": "Google Gemma 3", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507", + "display_name": "Qwen3 235B-A22B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 125000, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "qwen/qwen-2.5-7b-vision-instruct", - "name": "Qwen 2.5 7B Vision Instruct", - "display_name": "Qwen 2.5 7B Vision Instruct", + "id": "Qwen/Qwen3-8B", + "name": "Qwen3 8B", + "display_name": "Qwen3 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 125000, - "output": 4096 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-03-31", + "release_date": "2025-03-31", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen/qwen3-embedding-4b", - "name": "Qwen 3 Embedding 4B", - "display_name": "Qwen 3 Embedding 4B", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 2048 + "context": 32768, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", - "type": "embedding" + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" }, { - "id": "meta/llama-3.2-1b-instruct", - "name": "Llama 3.2 1B Instruct", - "display_name": "Llama 3.2 1B Instruct", + "id": "Qwen/Qwen3-1.7B-Base", + "name": "Qwen3 1.7B Base", + "display_name": "Qwen3 1.7B Base", "modalities": { "input": [ "text" @@ -82431,53 +84912,78 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": false, + "release_date": "2025-03-31", + "last_updated": "2025-03-31", "type": "chat" }, { - "id": "meta/llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct", - "display_name": "Llama 3.2 3B Instruct", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "meta/llama-3.1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "Qwen/Qwen2.5-Coder-0.5B", + "name": "Qwen2.5-Coder-0.5B", + "display_name": "Qwen2.5-Coder-0.5B", "modalities": { "input": [ "text" @@ -82487,54 +84993,64 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2024-11-12", + "last_updated": "2024-11-12", "type": "chat" }, { - "id": "meta/llama-3.2-11b-vision-instruct", - "name": "Llama 3.2 11B Vision Instruct", - "display_name": "Llama 3.2 11B Vision Instruct", + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "osmosis/osmosis-structure-0.6b", - "name": "Osmosis Structure 0.6B", - "display_name": "Osmosis Structure 0.6B", + "id": "Qwen/Qwen3-4B-Instruct-2507", + "name": "Qwen3 4B Instruct", + "display_name": "Qwen3 4B Instruct", "modalities": { "input": [ "text" @@ -82544,25 +85060,36 @@ ] }, "limit": { - "context": 4000, - "output": 2048 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": false, + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "mistral/mistral-nemo-12b-instruct", - "name": "Mistral Nemo 12B Instruct", - "display_name": "Mistral Nemo 12B Instruct", + "id": "Qwen/Qwen3-4B-Base", + "name": "Qwen3 4B Base", + "display_name": "Qwen3 4B Base", "modalities": { "input": [ "text" @@ -82572,34 +85099,36 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": false, + "release_date": "2025-03-31", + "last_updated": "2025-03-31", "type": "chat" - } - ] - }, - "evroc": { - "id": "evroc", - "name": "evroc", - "display_name": "evroc", - "api": "https://models.think.evroc.com/v1", - "doc": "https://docs.evroc.com/products/think/overview.html", - "models": [ + }, { - "id": "intfloat/multilingual-e5-large-instruct", - "name": "E5 Multi-Lingual Large Embeddings 0.6B", - "display_name": "E5 Multi-Lingual Large Embeddings 0.6B", + "id": "LiquidAI/LFM2-24B-A2B", + "name": "LFM2 24B A2B", + "display_name": "LFM2 24B A2B", "modalities": { "input": [ "text" @@ -82609,23 +85138,36 @@ ] }, "limit": { - "context": 512, - "output": 512 + "context": 32768, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "release_date": "2026-01-31", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "nvidia/Llama-3.3-70B-Instruct-FP8", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "HuggingFaceTB/SmolLM3-3B-Base", + "name": "SmolLM3 3B Base", + "display_name": "SmolLM3 3B Base", "modalities": { "input": [ "text" @@ -82635,37 +85177,47 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", "type": "chat" }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -82675,29 +85227,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -82708,31 +85268,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "mistralai/Mistral-Medium-3.5-128B", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "poolside/laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -82740,19 +85305,29 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "mistralai/Voxtral-Small-24B-2507", - "name": "Voxtral Small 24B", - "display_name": "Voxtral Small 24B", + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "audio", "text" ], "output": [ @@ -82760,36 +85335,35 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 163840, + "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "evroc/roc", - "name": "roc", - "display_name": "roc", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 163840, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -82808,57 +85382,27 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-06-06", - "last_updated": "2026-06-06", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-Embedding-8B", - "name": "Qwen3 Embedding 8B", - "display_name": "Qwen3 Embedding 8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", - "type": "embedding" + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B-FP8", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -82877,16 +85421,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Qwen/Qwen3-Reranker-4B", - "name": "Qwen3 Reranker 4B", - "display_name": "Qwen3 Reranker 4B", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -82896,23 +85441,37 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", - "type": "rerank" + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen3 VL 30B", - "display_name": "Qwen3 VL 30B", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -82924,49 +85483,37 @@ ] }, "limit": { - "context": 100000, - "output": 100000 + "context": 262144, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", - "type": "chat" - }, - { - "id": "KBLab/kb-whisper-large", - "name": "KB Whisper", - "display_name": "KB Whisper", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 448, - "output": 448 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -82979,9 +85526,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82989,66 +85536,100 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/whisper-large-v3", - "name": "Whisper 3 Large", - "display_name": "Whisper 3 Large", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "audio" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 4096 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/whisper-large-v3-turbo", - "name": "Whisper Large v3 Turbo", - "display_name": "Whisper Large v3 Turbo", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 448 + "context": 131072, + "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { @@ -83064,9 +85645,10 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 131072, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -83074,7 +85656,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -83082,187 +85670,201 @@ "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "abacus": { - "id": "abacus", - "name": "Abacus", - "display_name": "Abacus", - "api": "https://routellm.abacus.ai/v1", - "doc": "https://abacus.ai/help/api", - "models": [ + }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-06-30", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "meta-llama/Llama-3.2-1B-Instruct", + "name": "Llama 3.2 1B Instruct", + "display_name": "Llama 3.2 1B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 60000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-31", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "meta-llama/Llama-3.2-1B", + "name": "Llama-3.2-1B", + "display_name": "Llama-3.2-1B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 131072, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "type": "chat" + }, + { + "id": "meta-llama/Llama-3.2-3B", + "name": "Llama-3.2-3B", + "display_name": "Llama-3.2-3B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "meta-llama/Llama-3.2-3B-Instruct", + "name": "Llama 3.2 3B Instruct", + "display_name": "Llama 3.2 3B Instruct", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 80000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -83270,46 +85872,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-31", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "XiaomiMiMo/MiMo-V2.5-Pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -83320,239 +85912,220 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "claude-3-7-sonnet-20250219", - "name": "Claude Sonnet 3.7", - "display_name": "Claude Sonnet 3.7", + "id": "XiaomiMiMo/MiMo-V2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", + "interleaved": true, + "summaries": true, + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - }, + } + ] + }, + "siliconflow-com": { + "id": "siliconflow-com", + "name": "SiliconFlow", + "display_name": "SiliconFlow", + "api": "https://api.siliconflow.com/v1", + "doc": "https://cloud.siliconflow.com/models", + "models": [ { - "id": "grok-4-0709", - "name": "Grok 4", - "display_name": "Grok 4", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "zai-org/GLM-5", + "name": "zai-org/GLM-5", + "display_name": "zai-org/GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 205000, + "output": 205000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-06-15", + "type": "chat" + }, + { + "id": "zai-org/GLM-4.5-Air", + "name": "zai-org/GLM-4.5-Air", + "display_name": "zai-org/GLM-4.5-Air", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131000, + "output": 131000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2025-07-28", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1049000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -83561,53 +86134,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "zai-org/GLM-5.1", + "name": "zai-org/GLM-5.1", + "display_name": "zai-org/GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 205000, + "output": 205000 }, "temperature": true, "tool_call": true, @@ -83628,15 +86183,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "zai-org/GLM-5V-Turbo", + "name": "zai-org/GLM-5V-Turbo", + "display_name": "zai-org/GLM-5V-Turbo", "modalities": { "input": [ "text", @@ -83647,93 +86201,75 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "tencent/Hunyuan-A13B-Instruct", + "name": "tencent/Hunyuan-A13B-Instruct", + "display_name": "tencent/Hunyuan-A13B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2025-06-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "tencent/Hy3-preview", + "name": "Hy3 preview", + "display_name": "Hy3 preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -83746,131 +86282,119 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gemini-3-pro-image-preview", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "Qwen/Qwen3.5-27B", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20", - "type": "imageGeneration" + "release_date": "2026-02-23", + "last_updated": "2026-02-23", + "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "Qwen/Qwen2.5-7B-Instruct", + "name": "Qwen/Qwen2.5-7B-Instruct", + "display_name": "Qwen/Qwen2.5-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 33000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "release_date": "2024-09-18", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat Latest", - "display_name": "GPT-5.2 Chat Latest", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen/Qwen3.5-9B", + "display_name": "Qwen/Qwen3.5-9B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-01-01", - "last_updated": "2026-01-01", + "release_date": "2026-03-03", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "Qwen/Qwen3-14B", + "name": "Qwen/Qwen3-14B", + "display_name": "Qwen/Qwen3-14B", "modalities": { "input": [ "text" @@ -83880,10 +86404,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131000, + "output": 131000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -83892,113 +86416,89 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "release_date": "2025-04-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "grok-code-fast-1", - "name": "Grok Code Fast 1", - "display_name": "Grok Code Fast 1", + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen/Qwen2.5-72B-Instruct", + "display_name": "Qwen/Qwen2.5-72B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 33000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-09-01", - "last_updated": "2025-09-01", + "release_date": "2024-09-18", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.3-codex-xhigh", - "name": "GPT-5.3 Codex XHigh", - "display_name": "GPT-5.3 Codex XHigh", + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "llama-3.3-70b-versatile", - "name": "Llama 3.3 70B Versatile", - "display_name": "Llama 3.3 70B Versatile", + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", "modalities": { "input": [ "text" @@ -84008,8 +86508,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -84017,58 +86517,56 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "release_date": "2025-08-01", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "mimo-v2-pro", - "name": "MiMo-V2-Pro", - "display_name": "MiMo-V2-Pro", + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "display_name": "Qwen/Qwen3-VL-235B-A22B-Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2025-10-04", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "Qwen/Qwen3-8B", + "name": "Qwen/Qwen3-8B", + "display_name": "Qwen/Qwen3-8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131000, + "output": 131000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -84077,158 +86575,138 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2025-04-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "Qwen/Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "display_name": "Qwen/Qwen3-VL-235B-A22B-Thinking", "modalities": { "input": [ "text", @@ -84239,10 +86717,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -84251,82 +86729,74 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2025-10-04", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-3.1-flash-image-preview", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26", - "type": "imageGeneration" + "release_date": "2026-04-17", + "last_updated": "2026-04-17", + "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "display_name": "Qwen/Qwen3-VL-30B-A3B-Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -84345,16 +86815,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "release_date": "2025-10-11", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "Qwen/Qwen3-VL-8B-Instruct", + "name": "Qwen/Qwen3-VL-8B-Instruct", + "display_name": "Qwen/Qwen3-VL-8B-Instruct", "modalities": { "input": [ "text", @@ -84365,105 +86835,78 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "release_date": "2025-10-15", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "grok-4-fast-non-reasoning", - "name": "Grok 4 Fast (Non-Reasoning)", - "display_name": "Grok 4 Fast (Non-Reasoning)", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "display_name": "Qwen/Qwen3-30B-A3B-Instruct-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 16384 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "release_date": "2025-07-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "display_name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "release_date": "2025-07-31", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "Qwen/Qwen3-VL-32B-Instruct", + "name": "Qwen/Qwen3-VL-32B-Instruct", + "display_name": "Qwen/Qwen3-VL-32B-Instruct", "modalities": { "input": [ "text", @@ -84474,48 +86917,24 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2025-10-21", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat Latest", - "display_name": "GPT-5.3 Chat Latest", + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-VL-30B-A3B-Instruct", "modalities": { "input": [ "text", @@ -84526,25 +86945,24 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "release_date": "2025-10-05", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "kimi-k2-turbo-preview", - "name": "Kimi K2 Turbo Preview", - "display_name": "Kimi K2 Turbo Preview", + "id": "Qwen/Qwen3-32B", + "name": "Qwen/Qwen3-32B", + "display_name": "Qwen/Qwen3-32B", "modalities": { "input": [ "text" @@ -84554,24 +86972,36 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", + "release_date": "2025-04-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "Qwen/Qwen3-VL-32B-Thinking", + "name": "Qwen/Qwen3-VL-32B-Thinking", + "display_name": "Qwen/Qwen3-VL-32B-Thinking", "modalities": { "input": [ "text", @@ -84582,61 +87012,49 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2025-10-21", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "display_name": "Qwen/Qwen3-235B-A22B-Thinking-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -84645,237 +87063,153 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2025-07-28", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMaxAI/MiniMax-M2.5", + "display_name": "MiniMaxAI/MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 197000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "release_date": "2026-02-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "inclusionAI/Ling-flash-2.0", + "name": "inclusionAI/Ling-flash-2.0", + "display_name": "inclusionAI/Ling-flash-2.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131000, + "output": 131000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-09-18", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-09-04", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "route-llm", - "name": "RouteLLM", - "display_name": "RouteLLM", + "id": "deepseek-ai/DeepSeek-V3", + "name": "deepseek-ai/DeepSeek-V3", + "display_name": "deepseek-ai/DeepSeek-V3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 164000, + "output": 164000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2026-07-10", + "release_date": "2024-12-26", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "deepseek-ai/DeepSeek-R1", + "name": "deepseek-ai/DeepSeek-R1", + "display_name": "deepseek-ai/DeepSeek-R1", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 164000, + "output": 164000 }, "temperature": true, "tool_call": true, @@ -84885,34 +87219,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2025-05-28", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "deepseek-ai/DeepSeek-V3.2", + "display_name": "deepseek-ai/DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 164000, + "output": 164000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -84920,135 +87258,88 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2025-12-03", + "last_updated": "2025-12-03", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "deepseek-ai/DeepSeek-V3.2-Exp", + "display_name": "deepseek-ai/DeepSeek-V3.2-Exp", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 164000, + "output": 164000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2025-10-10", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "Nano Banana", - "display_name": "Nano Banana", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "deepseek-ai/DeepSeek-V3.1", + "display_name": "deepseek-ai/DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 164000, + "output": 164000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", - "type": "imageGeneration" + "release_date": "2025-08-25", + "last_updated": "2025-11-25", + "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -85057,49 +87348,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -85108,47 +87388,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "display_name": "deepseek-ai/DeepSeek-V3.1-Terminus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 32768 + "context": 164000, + "output": 164000 }, "temperature": true, "tool_call": true, @@ -85156,112 +87425,96 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2025-09-29", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "stepfun-ai/Step-3.5-Flash", + "name": "stepfun-ai/Step-3.5-Flash", + "display_name": "stepfun-ai/Step-3.5-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "qwen-2.5-coder-32b", - "name": "Qwen 2.5 Coder 32B", - "display_name": "Qwen 2.5 Coder 32B", + "id": "moonshotai/Kimi-K2.6", + "name": "moonshotai/Kimi-K2.6", + "display_name": "moonshotai/Kimi-K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-11-11", - "last_updated": "2024-11-11", + "release_date": "2026-04-21", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "moonshotai/Kimi-K2.5", + "name": "moonshotai/Kimi-K2.5", + "display_name": "moonshotai/Kimi-K2.5", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -85272,95 +87525,67 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "openai/gpt-oss-20b", + "name": "openai/gpt-oss-20b", + "display_name": "openai/gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2025-08-13", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "openai/gpt-oss-120b", + "name": "openai/gpt-oss-120b", + "display_name": "openai/gpt-oss-120b", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131000, + "output": 8000 }, "temperature": true, "tool_call": true, @@ -85370,92 +87595,88 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-08-13", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "baidu/ERNIE-4.5-300B-A47B", + "name": "baidu/ERNIE-4.5-300B-A47B", + "display_name": "baidu/ERNIE-4.5-300B-A47B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 16384 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-11-17", - "last_updated": "2025-11-17", + "release_date": "2025-07-02", + "last_updated": "2025-11-25", "type": "chat" - }, + } + ] + }, + "ai-router": { + "id": "ai-router", + "name": "AI-ROUTER", + "display_name": "AI-ROUTER", + "api": "https://api.ai-router.dev/v1", + "doc": "https://ai-router.dev/openai-compatible-api-gateway/", + "models": [ { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -85468,26 +87689,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -85503,10 +87725,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -85519,26 +87741,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -85552,38 +87775,34 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-sonnet-4-20250514", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -85595,64 +87814,14 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-14", - "last_updated": "2025-05-14", - "type": "chat" - }, - { - "id": "o3", - "name": "o3", - "display_name": "o3", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "default": true }, "extra_capabilities": { "reasoning": { @@ -85661,6 +87830,15 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -85670,9 +87848,9 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { @@ -85682,14 +87860,15 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -85727,11 +87906,20 @@ "release_date": "2026-07-09", "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "inference": { + "id": "inference", + "name": "Inference", + "display_name": "Inference", + "api": "https://inference.net/v1", + "doc": "https://inference.net/models", + "models": [ { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "google/gemma-3", + "name": "Google Gemma 3", + "display_name": "Google Gemma 3", "modalities": { "input": [ "text", @@ -85742,31 +87930,25 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 125000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "qwen/qwen-2.5-7b-vision-instruct", + "name": "Qwen 2.5 7B Vision Instruct", + "display_name": "Qwen 2.5 7B Vision Instruct", "modalities": { "input": [ "text", @@ -85777,8 +87959,8 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 125000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -85786,243 +87968,128 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "qwen/qwen3-embedding-4b", + "name": "Qwen 3 Embedding 4B", + "display_name": "Qwen 3 Embedding 4B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32000, + "output": 2048 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", - "type": "chat" + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "type": "embedding" }, { - "id": "claude-opus-4-20250514", - "name": "Claude Opus 4", - "display_name": "Claude Opus 4", + "id": "meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct", + "display_name": "Llama 3.2 1B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-14", - "last_updated": "2025-05-14", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "meta/llama-3.2-3b-instruct", + "name": "Llama 3.2 3B Instruct", + "display_name": "Llama 3.2 3B Instruct", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", - "type": "chat" - }, - { - "id": "gpt-5.1-chat-latest", - "name": "GPT-5.1 Chat Latest", - "display_name": "GPT-5.1 Chat Latest", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "meta/llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11B Vision Instruct", + "display_name": "Llama 3.2 11B Vision Instruct", "modalities": { "input": [ "text", @@ -86033,30 +88100,25 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2023-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "osmosis/osmosis-structure-0.6b", + "name": "Osmosis Structure 0.6B", + "display_name": "Osmosis Structure 0.6B", "modalities": { "input": [ "text" @@ -86066,36 +88128,25 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 4000, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "zai-org/GLM-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "mistral/mistral-nemo-12b-instruct", + "name": "Mistral Nemo 12B Instruct", + "display_name": "Mistral Nemo 12B Instruct", "modalities": { "input": [ "text" @@ -86105,26 +88156,34 @@ ] }, "limit": { - "context": 131072, - "output": 96000 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" - }, + } + ] + }, + "evroc": { + "id": "evroc", + "name": "evroc", + "display_name": "evroc", + "api": "https://models.think.evroc.com/v1", + "doc": "https://docs.evroc.com/products/think/overview.html", + "models": [ { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "intfloat/multilingual-e5-large-instruct", + "name": "E5 Multi-Lingual Large Embeddings 0.6B", + "display_name": "E5 Multi-Lingual Large Embeddings 0.6B", "modalities": { "input": [ "text" @@ -86134,30 +88193,23 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 512, + "output": 512 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "nvidia/Llama-3.3-70B-Instruct-FP8", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -86167,41 +88219,37 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "zai-org/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -86214,17 +88262,16 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -86234,7 +88281,7 @@ ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -86245,29 +88292,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct", - "display_name": "Qwen3 235B A22B Instruct", + "id": "mistralai/Mistral-Medium-3.5-128B", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -86275,7 +88316,7 @@ }, "limit": { "context": 262144, - "output": 8192 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -86283,18 +88324,19 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-01", - "last_updated": "2025-07-01", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "Qwen/Qwen2.5-72B-Instruct", - "name": "Qwen 2.5 72B Instruct", - "display_name": "Qwen 2.5 72B Instruct", + "id": "mistralai/Voxtral-Small-24B-2507", + "name": "Voxtral Small 24B", + "display_name": "Voxtral Small 24B", "modalities": { "input": [ + "audio", "text" ], "output": [ @@ -86302,27 +88344,28 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "release_date": "2025-03-01", + "last_updated": "2025-03-01", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "evroc/roc", + "name": "roc", + "display_name": "roc", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -86330,7 +88373,7 @@ }, "limit": { "context": 262144, - "output": 8192 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -86350,15 +88393,16 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-06-06", + "last_updated": "2026-06-06", "type": "chat" }, { - "id": "Qwen/QwQ-32B", - "name": "QwQ 32B", - "display_name": "QwQ 32B", + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen3 Embedding 8B", + "display_name": "Qwen3 Embedding 8B", "modalities": { "input": [ "text" @@ -86368,8 +88412,37 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 40960, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "type": "embedding" + }, + { + "id": "Qwen/Qwen3.6-35B-A3B-FP8", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -86388,16 +88461,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-11-28", - "last_updated": "2024-11-28", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "Qwen/Qwen3-Reranker-4B", + "name": "Qwen3 Reranker 4B", + "display_name": "Qwen3 Reranker 4B", "modalities": { "input": [ "text" @@ -86407,104 +88480,77 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 32000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", - "type": "chat" + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "type": "rerank" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3 VL 30B", + "display_name": "Qwen3 VL 30B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 100000, + "output": 100000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "KBLab/kb-whisper-large", + "name": "KB Whisper", + "display_name": "KB Whisper", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 448, + "output": 448 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -86516,8 +88562,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -86532,81 +88578,67 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "openai/whisper-large-v3", + "name": "Whisper 3 Large", + "display_name": "Whisper 3 Large", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 448, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "openai/whisper-large-v3-turbo", + "name": "Whisper Large v3 Turbo", + "display_name": "Whisper Large v3 Turbo", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 448, + "output": 448 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2024-10-01", + "last_updated": "2024-10-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -86616,10 +88648,9 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 65536, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -86632,17 +88663,27 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-06-15", - "last_updated": "2025-06-15", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "abacus": { + "id": "abacus", + "name": "Abacus", + "display_name": "Abacus", + "api": "https://routellm.abacus.ai/v1", + "doc": "https://abacus.ai/help/api", + "models": [ { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -86650,79 +88691,86 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "DeepSeek V3.1 Terminus", - "display_name": "DeepSeek V3.1 Terminus", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -86730,24 +88778,24 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", @@ -86759,8 +88807,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -86774,27 +88822,28 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -86804,23 +88853,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" @@ -86828,128 +88893,139 @@ }, "limit": { "context": 1048576, - "output": 8192 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - "name": "Llama 3.1 405B Instruct Turbo", - "display_name": "Llama 3.1 405B Instruct Turbo", + "id": "claude-3-7-sonnet-20250219", + "name": "Claude Sonnet 3.7", + "display_name": "Claude Sonnet 3.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" - }, - { - "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": false, + "summaries": false, + "visibility": "full", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic uses thinking budget tokens" + ] + } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "meta-llama/Meta-Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "grok-4-0709", + "name": "Grok 4", + "display_name": "Grok 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" - } - ] - }, - "inceptron": { - "id": "inceptron", - "name": "Inceptron", - "display_name": "Inceptron", - "api": "https://api.inceptron.io/v1", - "doc": "https://docs.inceptron.io", - "models": [ + }, { - "id": "zai-org/GLM-5.1-FP8", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -86958,27 +89034,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -86986,68 +89076,53 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" - }, - { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 196608, - "output": 196608 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -87058,10 +89133,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -87070,29 +89145,45 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6-Fast", - "name": "Kimi K2.6 Fast", - "display_name": "Kimi K2.6 Fast", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -87100,7 +89191,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -87119,17 +89210,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -87140,88 +89231,92 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" - } - ] - }, - "empiriolabs": { - "id": "empiriolabs", - "name": "EmpirioLabs AI", - "display_name": "EmpirioLabs AI", - "api": "https://api.empiriolabs.ai/v1", - "doc": "https://docs.empiriolabs.ai", - "models": [ + }, { - "id": "mimo-v2-5", - "name": "MiMo V2.5", - "display_name": "MiMo V2.5", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "minimax-m2-7-highspeed", - "name": "MiniMax M2.7 Highspeed", - "display_name": "MiniMax M2.7 Highspeed", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 32768 }, "temperature": true, @@ -87230,57 +89325,84 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen3-5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gemini-3-pro-image-preview", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 65536, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", - "type": "chat" + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "type": "imageGeneration" }, { - "id": "glm-4-7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -87288,30 +89410,33 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "qwen3-5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat Latest", + "display_name": "GPT-5.2 Chat Latest", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -87320,28 +89445,27 @@ "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2026-01-01", + "last_updated": "2026-01-01", "type": "chat" }, { - "id": "kimi-k2-7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -87349,78 +89473,116 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "qwen3-5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "display_name": "Grok Code Fast 1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2025-09-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gpt-5.3-codex-xhigh", + "name": "GPT-5.3 Codex XHigh", + "display_name": "GPT-5.3 Codex XHigh", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B Versatile", + "display_name": "Llama 3.3 70B Versatile", "modalities": { "input": [ "text" @@ -87430,50 +89592,35 @@ ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-06-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen3-6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "mimo-v2-pro", + "name": "MiMo-V2-Pro", + "display_name": "MiMo-V2-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -87481,58 +89628,81 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "qwen3-6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "step-3-7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -87540,20 +89710,40 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "minimax-m2-7", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -87561,67 +89751,82 @@ }, "limit": { "context": 200000, - "output": 32768 + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "qwen3-7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-06-12", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -87629,74 +89834,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kimi-k2-7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gemini-3.1-flash-image-preview", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 131072 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" - }, - { - "id": "glm-4-5-flash", - "name": "GLM 4.5 Flash", - "display_name": "GLM 4.5 Flash", - "modalities": { - "input": [ - "text" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 200000, - "output": 98304 + "context": 1048576, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "imageGeneration" }, { "id": "qwen3-max", @@ -87711,8 +89909,8 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -87733,28 +89931,28 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -87763,127 +89961,157 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "glm-5-2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "display_name": "Grok 4 Fast (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 2000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "muse-spark-1-1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "knowledge": "2024-10", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "qwen3-7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-12", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3-5-4b", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat Latest", + "display_name": "GPT-5.3 Chat Latest", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -87892,15 +90120,15 @@ "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "open_weights": false, + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "qwen3-6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "kimi-k2-turbo-preview", + "name": "Kimi K2 Turbo Preview", + "display_name": "Kimi K2 Turbo Preview", "modalities": { "input": [ "text" @@ -87911,250 +90139,327 @@ }, "limit": { "context": 256000, - "output": 65536 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" }, { - "id": "gemma-4-26b-a4b", - "name": "Gemma 4 26B-A4B", - "display_name": "Gemma 4 26B-A4B", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-06-12", - "type": "chat" - }, - { - "id": "qwen3-6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 200000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "qwen3-5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen3-6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-05", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "qwen3-5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "glm-5-1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "route-llm", + "name": "RouteLLM", + "display_name": "RouteLLM", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202000, - "output": 128000 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-06-12", + "attachment": true, + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2026-07-10", "type": "chat" }, { - "id": "step-3-5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -88162,75 +90467,75 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "mistral-medium-3", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 130000, - "output": 40000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "step-3-5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistral-small-4", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -88241,108 +90546,144 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "mimo-v2-5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "imageGeneration" }, { - "id": "qwen3-5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" - } - ] - }, - "alibaba-token-plan": { - "id": "alibaba-token-plan", - "name": "Alibaba Token Plan", - "display_name": "Alibaba Token Plan", - "api": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", - "models": [ + }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -88351,38 +90692,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3.8-max-preview", - "name": "Qwen3.8 Max Preview", - "display_name": "Qwen3.8 Max Preview", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 500000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -88392,64 +90742,70 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen-2.5-coder-32b", + "name": "Qwen 2.5 Coder 32B", + "display_name": "Qwen 2.5 Coder 32B", "modalities": { "input": [ "text" @@ -88459,47 +90815,37 @@ ] }, "limit": { - "context": 202752, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2024-11-11", + "last_updated": "2024-11-11", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -88510,78 +90856,95 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -88592,240 +90955,284 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "wan2.7-image-pro", - "name": "Wan2.7 Image Pro", - "display_name": "Wan2.7 Image Pro", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 2000000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29", - "type": "imageGeneration" + "release_date": "2025-11-17", + "last_updated": "2025-11-17", + "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "wan2.7-image", - "name": "Wan2.7 Image", - "display_name": "Wan2.7 Image", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29", - "type": "imageGeneration" + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "claude-sonnet-4-20250514", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" - }, - { - "id": "happyhorse-1.1-i2v", - "name": "HappyHorse 1.1 Image-to-Video", - "display_name": "HappyHorse 1.1 Image-to-Video", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17", + "release_date": "2025-05-14", + "last_updated": "2025-05-14", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -88833,127 +91240,158 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-03", - "last_updated": "2025-12-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "happyhorse-1.1-r2v", - "name": "HappyHorse 1.1 Reference-to-Video", - "display_name": "HappyHorse 1.1 Reference-to-Video", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen-image-2.0-pro", - "name": "Qwen Image 2.0 Pro", - "display_name": "Qwen Image 2.0 Pro", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 64000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", - "type": "imageGeneration" + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -88964,185 +91402,223 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "claude-opus-4-20250514", + "name": "Claude Opus 4", + "display_name": "Claude Opus 4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "release_date": "2025-05-14", + "last_updated": "2025-05-14", "type": "chat" }, { - "id": "happyhorse-1.1-t2v", - "name": "HappyHorse 1.1 Text-to-Video", - "display_name": "HappyHorse 1.1 Text-to-Video", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen-image-2.0", - "name": "Qwen Image 2.0", - "display_name": "Qwen Image 2.0", + "id": "gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat Latest", + "display_name": "GPT-5.1 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", - "type": "imageGeneration" + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "claude-opus-4-1-20250805", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "meta": { - "id": "meta", - "name": "Meta", - "display_name": "Meta", - "api": "https://api.meta.ai/v1", - "doc": "https://dev.meta.ai/docs", - "models": [ + }, { - "id": "muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "pdf", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -89156,38 +91632,28 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - } - ] - }, - "azure-cognitive-services": { - "id": "azure-cognitive-services", - "name": "Azure Cognitive Services", - "display_name": "Azure Cognitive Services", - "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", - "models": [ + }, { - "id": "gpt-chat-latest", - "name": "GPT Chat Latest", - "display_name": "GPT Chat Latest", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -89195,86 +91661,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-05-05", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "zai-org/GLM-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 96000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -89282,50 +91729,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -89333,109 +91762,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "zai-org/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-07-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -89454,388 +91838,272 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct", + "display_name": "Qwen3 235B A22B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-31", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B Instruct", + "display_name": "Qwen 2.5 72B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "Qwen/QwQ-32B", + "name": "QwQ 32B", + "display_name": "QwQ 32B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "release_date": "2024-11-28", + "last_updated": "2024-11-28", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -89843,165 +92111,99 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "attachment": false, + "open_weights": true, + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90012,17 +92214,16 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2025-06-15", + "last_updated": "2025-06-15", "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -90032,105 +92233,77 @@ ] }, "limit": { - "context": 8191, - "output": 1536 + "context": 1000000, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - }, - { - "id": "cohere-embed-v3-english", - "name": "Embed v3 English", - "display_name": "Embed v3 English", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 512, - "output": 1024 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B 16E Instruct", - "display_name": "Llama 4 Scout 17B 16E Instruct", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "type": "chat" - }, - { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8191, - "output": 3072 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" }, { - "id": "cohere-command-a", - "name": "Command A", - "display_name": "Command A", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "display_name": "DeepSeek V3.1 Terminus", "modalities": { "input": [ "text" @@ -90140,7 +92313,7 @@ ] }, "limit": { - "context": 131072, + "context": 128000, "output": 8192 }, "temperature": true, @@ -90151,29 +92324,29 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90181,85 +92354,82 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "cohere-embed-v3-multilingual", - "name": "Embed v3 Multilingual", - "display_name": "Embed v3 Multilingual", + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 1024 + "context": 1048576, + "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "codestral-2501", - "name": "Codestral 25.01", - "display_name": "Codestral 25.01", + "id": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "name": "Llama 3.1 405B Instruct Turbo", + "display_name": "Llama 3.1 405B Instruct Turbo", "modalities": { "input": [ "text" @@ -90269,8 +92439,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -90278,16 +92448,15 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-03", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": true, + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-3.5-turbo-0125", - "name": "GPT-3.5 Turbo 0125", - "display_name": "GPT-3.5 Turbo 0125", + "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -90297,25 +92466,24 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2024-01-25", - "last_updated": "2024-01-25", + "open_weights": true, + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-3.5-turbo-instruct", - "name": "GPT-3.5 Turbo Instruct", - "display_name": "GPT-3.5 Turbo Instruct", + "id": "meta-llama/Meta-Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -90325,39 +92493,47 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-09-21", - "last_updated": "2023-09-21", + "attachment": true, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" - }, + } + ] + }, + "inceptron": { + "id": "inceptron", + "name": "Inceptron", + "display_name": "Inceptron", + "api": "https://api.inceptron.io/v1", + "doc": "https://docs.inceptron.io", + "models": [ { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "zai-org/GLM-5.1-FP8", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 202752, + "output": 202752 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90366,42 +92542,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "zai-org/GLM-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90410,117 +92581,98 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ - "text", - "image", - "audio" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 196608, + "output": 196608 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "phi-4-mini", - "name": "Phi-4-mini", - "display_name": "Phi-4-mini", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "moonshotai/Kimi-K2.6-Fast", + "name": "Kimi K2.6 Fast", + "display_name": "Kimi K2.6 Fast", "modalities": { "input": [ "text", @@ -90531,130 +92683,119 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ - "text", - "image", - "audio" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" - }, + } + ] + }, + "empiriolabs": { + "id": "empiriolabs", + "name": "EmpirioLabs AI", + "display_name": "EmpirioLabs AI", + "api": "https://api.empiriolabs.ai/v1", + "doc": "https://docs.empiriolabs.ai", + "models": [ { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "mimo-v2-5", + "name": "MiMo V2.5", + "display_name": "MiMo V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "phi-4-reasoning-plus", - "name": "Phi-4-reasoning-plus", - "display_name": "Phi-4-reasoning-plus", + "id": "minimax-m2-7-highspeed", + "name": "MiniMax M2.7 Highspeed", + "display_name": "MiniMax M2.7 Highspeed", "modalities": { "input": [ "text" @@ -90664,77 +92805,55 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 200000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "qwen3-5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "glm-4-7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ "text" @@ -90744,101 +92863,69 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "qwen3-5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "o1", - "name": "o1", - "display_name": "o1", + "id": "kimi-k2-7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 256000, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -90846,88 +92933,78 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "mistral-small-2503", - "name": "Mistral Small 3.1", - "display_name": "Mistral Small 3.1", + "id": "qwen3-5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "cohere-embed-v-4-0", - "name": "Embed v4", - "display_name": "Embed v4", + "id": "kimi-k2-6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 1536 + "context": 256000, + "output": 16000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -90937,8 +93014,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -90948,127 +93025,98 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "qwen3-6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "qwen3-6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "phi-4-mini-reasoning", - "name": "Phi-4-mini-reasoning", - "display_name": "Phi-4-mini-reasoning", + "id": "step-3-7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -91076,46 +93124,45 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "gpt-4-turbo-vision", - "name": "GPT-4 Turbo Vision", - "display_name": "GPT-4 Turbo Vision", + "id": "minimax-m2-7", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "qwen3-7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -91125,39 +93172,40 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 524288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91165,108 +93213,92 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "phi-4-reasoning", - "name": "Phi-4-reasoning", - "display_name": "Phi-4-reasoning", + "id": "kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 256000, + "output": 131072 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "glm-4-5-flash", + "name": "GLM 4.5 Flash", + "display_name": "GLM 4.5 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91275,39 +93307,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -91315,133 +93336,124 @@ }, "limit": { "context": 1000000, - "output": 16384 + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "glm-5-2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "qwen3-8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "ministral-3b", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "muse-spark-1-1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-03", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -91451,10 +93463,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91462,113 +93474,81 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "model-router", - "name": "Model Router", - "display_name": "Model Router", + "id": "qwen3-7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-05-19", - "last_updated": "2025-11-18", - "type": "chat" - }, - { - "id": "phi-4", - "name": "Phi-4", - "display_name": "Phi-4", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepseek-v3.2-speciale", - "name": "DeepSeek-V3.2-Speciale", - "display_name": "DeepSeek-V3.2-Speciale", + "id": "qwen3-5-4b", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "gpt-3.5-turbo-1106", - "name": "GPT-3.5 Turbo 1106", - "display_name": "GPT-3.5 Turbo 1106", + "id": "qwen3-6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -91578,123 +93558,101 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 256000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-11-06", - "last_updated": "2023-11-06", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "gemma-4-26b-a4b", + "name": "Gemma 4 26B-A4B", + "display_name": "Gemma 4 26B-A4B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "text-embedding-ada-002", - "name": "text-embedding-ada-002", - "display_name": "text-embedding-ada-002", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 1536 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2022-12-15", - "last_updated": "2022-12-15", - "type": "embedding" - }, - { - "id": "phi-4-multimodal", - "name": "Phi-4-multimodal", - "display_name": "Phi-4-multimodal", + "id": "qwen3-6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "codex-mini", - "name": "Codex Mini", - "display_name": "Codex Mini", + "id": "qwen3-5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91702,133 +93660,110 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-05-16", - "last_updated": "2025-05-16", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "qwen3-6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "qwen3-5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex Mini", - "display_name": "GPT-5.1 Codex Mini", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - } - ] - }, - "clarifai": { - "id": "clarifai", - "name": "Clarifai", - "display_name": "Clarifai", - "api": "https://api.clarifai.com/v2/ext/openai/v1", - "doc": "https://docs.clarifai.com/compute/inference/", - "models": [ + }, { - "id": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "glm-5-1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ "text" @@ -91838,25 +93773,25 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 202000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2026-02-12", + "release_date": "2026-04-07", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", + "id": "step-3-5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ "text" @@ -91866,7 +93801,7 @@ ] }, "limit": { - "context": 262144, + "context": 256000, "output": 131072 }, "temperature": true, @@ -91875,54 +93810,47 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2025-07-31", - "last_updated": "2026-02-25", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "qwen3-7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-30", - "last_updated": "2026-02-25", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", - "name": "Ministral 3 3B Reasoning 2512", - "display_name": "Ministral 3 3B Reasoning 2512", + "id": "mistral-medium-3", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -91933,37 +93861,36 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 130000, + "output": 40000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12", - "last_updated": "2026-02-25", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", - "name": "Ministral 3 14B Reasoning 2512", - "display_name": "Ministral 3 14B Reasoning 2512", + "id": "step-3-5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -91971,85 +93898,88 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-01", - "last_updated": "2025-12-12", + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "clarifai/main/models/mm-poly-8b", - "name": "MM Poly 8B", - "display_name": "MM Poly 8B", + "id": "mistral-small-4", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 256000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-06", - "last_updated": "2026-02-25", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", - "name": "DeepSeek OCR", - "display_name": "DeepSeek OCR", + "id": "mimo-v2-5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-10-20", - "last_updated": "2026-02-25", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "arcee_ai/AFM/models/trinity-mini", - "name": "Trinity Mini", - "display_name": "Trinity Mini", + "id": "qwen3-5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -92057,29 +93987,38 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-12", - "last_updated": "2026-02-25", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" - }, + } + ] + }, + "alibaba-token-plan": { + "id": "alibaba-token-plan", + "name": "Alibaba Token Plan", + "display_name": "Alibaba Token Plan", + "api": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "models": [ { - "id": "moonshotai/chat-completion/models/Kimi-K2_6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -92099,27 +94038,29 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "openai/chat-completion/models/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "qwen3.8-max-preview", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -92129,19 +94070,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-12-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "openai/chat-completion/models/gpt-oss-120b-high-throughput", - "name": "GPT OSS 120B High Throughput", - "display_name": "GPT OSS 120B High Throughput", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -92151,7 +94098,7 @@ ] }, "limit": { - "context": 131072, + "context": 202752, "output": 16384 }, "temperature": true, @@ -92160,16 +94107,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2026-02-25", + "open_weights": false, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", - "name": "MiniMax-M2.5 High Throughput", - "display_name": "MiniMax-M2.5 High Throughput", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -92179,8 +94137,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 202752, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -92188,42 +94146,44 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-25", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - } - ] - }, - "iflowcn": { - "id": "iflowcn", - "name": "iFlow", - "display_name": "iFlow", - "api": "https://apis.iflow.cn/v1", - "doc": "https://platform.iflow.cn/en/docs", - "models": [ + }, { - "id": "qwen3-vl-plus", - "name": "Qwen3-VL-Plus", - "display_name": "Qwen3-VL-Plus", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -92236,33 +94196,36 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3-32B", - "display_name": "Qwen3-32B", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -92275,17 +94238,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3-235B-A22B-Thinking", - "display_name": "Qwen3-235B-A22B-Thinking", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -92295,8 +94258,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -92317,44 +94280,41 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-01", - "last_updated": "2025-07-01", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3-235b", - "name": "Qwen3-235B-A22B", - "display_name": "Qwen3-235B-A22B", + "id": "wan2.7-image-pro", + "name": "Wan2.7 Image Pro", + "display_name": "Wan2.7 Image Pro", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", - "type": "chat" + "open_weights": false, + "release_date": "2026-05-29", + "last_updated": "2026-05-29", + "type": "imageGeneration" }, { - "id": "qwen3-max-preview", - "name": "Qwen3-Max-Preview", - "display_name": "Qwen3-Max-Preview", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -92364,13 +94324,14 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -92385,31 +94346,60 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3-Max", - "display_name": "Qwen3-Max", + "id": "wan2.7-image", + "name": "Wan2.7 Image", + "display_name": "Wan2.7 Image", "modalities": { "input": [ "text" ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-29", + "last_updated": "2026-05-29", + "type": "imageGeneration" + }, + { + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", + "modalities": { + "input": [ + "text", + "image", + "video" + ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -92422,17 +94412,17 @@ ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -92442,8 +94432,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -92453,76 +94443,95 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-01", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3-Coder-Plus", - "display_name": "Qwen3-Coder-Plus", + "id": "happyhorse-1.1-i2v", + "name": "HappyHorse 1.1 Image-to-Video", + "display_name": "HappyHorse 1.1 Image-to-Video", "modalities": { "input": [ + "image", "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-01", - "last_updated": "2025-07-01", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-17", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "deepseek-v3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2-Exp", - "display_name": "DeepSeek-V3.2-Exp", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -92532,30 +94541,37 @@ ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -92565,8 +94581,8 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -92576,82 +94592,75 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2025-01", + "release_date": "2025-12-03", + "last_updated": "2025-12-05", "type": "chat" }, { - "id": "kimi-k2", - "name": "Kimi-K2", - "display_name": "Kimi-K2", + "id": "happyhorse-1.1-r2v", + "name": "HappyHorse 1.1 Reference-to-Video", + "display_name": "HappyHorse 1.1 Reference-to-Video", "modalities": { "input": [ + "image", "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "release_date": "2026-07-17", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct", - "name": "Qwen3-235B-A22B-Instruct", - "display_name": "Qwen3-235B-A22B-Instruct", + "id": "qwen-image-2.0-pro", + "name": "Qwen Image 2.0 Pro", + "display_name": "Qwen Image 2.0 Pro", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-01", - "last_updated": "2025-07-01", - "type": "chat" + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03", + "type": "imageGeneration" }, { - "id": "kimi-k2-0905", - "name": "Kimi-K2-0905", - "display_name": "Kimi-K2-0905", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -92661,46 +94670,49 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 196608, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" - } - ] - }, - "gitlab": { - "id": "gitlab", - "name": "GitLab Duo", - "display_name": "GitLab Duo", - "doc": "https://docs.gitlab.com/user/duo_agent_platform/", - "models": [ + }, { - "id": "duo-chat-gpt-5-5", - "name": "Agentic Chat (GPT-5.5)", - "display_name": "Agentic Chat (GPT-5.5)", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -92708,83 +94720,128 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "duo-chat-gpt-5-codex", - "name": "Agentic Chat (GPT-5 Codex)", - "display_name": "Agentic Chat (GPT-5 Codex)", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "duo-chat-haiku-4-5", - "name": "Agentic Chat (Claude Haiku 4.5)", - "display_name": "Agentic Chat (Claude Haiku 4.5)", + "id": "happyhorse-1.1-t2v", + "name": "HappyHorse 1.1 Text-to-Video", + "display_name": "HappyHorse 1.1 Text-to-Video", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2026-01-08", - "last_updated": "2026-01-08", + "release_date": "2026-07-17", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "duo-chat-opus-4-8", - "name": "Agentic Chat (Claude Opus 4.8)", - "display_name": "Agentic Chat (Claude Opus 4.8)", + "id": "qwen-image-2.0", + "name": "Qwen Image 2.0", + "display_name": "Qwen Image 2.0", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03", + "type": "imageGeneration" + }, + { + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -92792,55 +94849,89 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "meta": { + "id": "meta", + "name": "Meta", + "display_name": "Meta", + "api": "https://api.meta.ai/v1", + "doc": "https://dev.meta.ai/docs", + "models": [ { - "id": "duo-chat-gpt-5-1", - "name": "Agentic Chat (GPT-5.1)", - "display_name": "Agentic Chat (GPT-5.1)", + "id": "muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "azure-cognitive-services": { + "id": "azure-cognitive-services", + "name": "Azure Cognitive Services", + "display_name": "Azure Cognitive Services", + "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "models": [ { - "id": "duo-chat-opus-4-6", - "name": "Agentic Chat (Claude Opus 4.6)", - "display_name": "Agentic Chat (Claude Opus 4.6)", + "id": "gpt-chat-latest", + "name": "GPT Chat Latest", + "display_name": "GPT Chat Latest", "modalities": { "input": [ "text", @@ -92852,26 +94943,31 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2025-12-01", + "release_date": "2026-05-05", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "duo-chat-gpt-5-6-terra", - "name": "Agentic Chat (GPT-5.6 Terra)", - "display_name": "Agentic Chat (GPT-5.6 Terra)", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -92883,38 +94979,58 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-02-28", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "duo-chat-gpt-5-2-codex", - "name": "Agentic Chat (GPT-5.2 Codex)", - "display_name": "Agentic Chat (GPT-5.2 Codex)", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -92923,17 +95039,37 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "duo-chat-gpt-5-6-luna", - "name": "Agentic Chat (GPT-5.6 Luna)", - "display_name": "Agentic Chat (GPT-5.6 Luna)", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -92954,6 +95090,29 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, "knowledge": "2026-02-16", @@ -92962,9 +95121,9 @@ "type": "chat" }, { - "id": "duo-chat-sonnet-4-6", - "name": "Agentic Chat (Claude Sonnet 4.6)", - "display_name": "Agentic Chat (Claude Sonnet 4.6)", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -92977,25 +95136,53 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "duo-chat-gpt-5-mini", - "name": "Agentic Chat (GPT-5 Mini)", - "display_name": "Agentic Chat (GPT-5 Mini)", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -93006,26 +95193,37 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "duo-chat-gpt-5-3-codex", - "name": "Agentic Chat (GPT-5.3 Codex)", - "display_name": "Agentic Chat (GPT-5.3 Codex)", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -93037,26 +95235,52 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2025-12-31", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "duo-chat-gpt-5-4-nano", - "name": "Agentic Chat (GPT-5.4 Nano)", - "display_name": "Agentic Chat (GPT-5.4 Nano)", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -93067,86 +95291,136 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "duo-chat-gpt-5-4-mini", - "name": "Agentic Chat (GPT-5.4 Mini)", - "display_name": "Agentic Chat (GPT-5.4 Mini)", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-03-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "duo-chat-gpt-5-2", - "name": "Agentic Chat (GPT-5.2)", - "display_name": "Agentic Chat (GPT-5.2)", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "knowledge": "2025-07-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "duo-chat-fable-5", - "name": "Agentic Chat (Claude Fable 5)", - "display_name": "Agentic Chat (Claude Fable 5)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -93158,26 +95432,48 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "duo-chat-gpt-5-4", - "name": "Agentic Chat (GPT-5.4)", - "display_name": "Agentic Chat (GPT-5.4)", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -93189,26 +95485,48 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "duo-chat-sonnet-4-5", - "name": "Agentic Chat (Claude Sonnet 4.5)", - "display_name": "Agentic Chat (Claude Sonnet 4.5)", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", @@ -93220,26 +95538,48 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2026-01-08", - "last_updated": "2026-01-08", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "duo-chat-opus-4-7", - "name": "Agentic Chat (Claude Opus 4.7)", - "display_name": "Agentic Chat (Claude Opus 4.7)", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -93251,8 +95591,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -93260,17 +95600,40 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "duo-chat-sonnet-5", - "name": "Agentic Chat (Claude Sonnet 5)", - "display_name": "Agentic Chat (Claude Sonnet 5)", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -93282,8 +95645,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -93291,17 +95654,40 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "duo-chat-opus-4-5", - "name": "Agentic Chat (Claude Opus 4.5)", - "display_name": "Agentic Chat (Claude Opus 4.5)", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -93320,19 +95706,46 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, "open_weights": false, "knowledge": "2025-03-31", - "release_date": "2026-01-08", - "last_updated": "2026-01-08", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "duo-chat-gpt-5-6-sol", - "name": "Agentic Chat (GPT-5.6 Sol)", - "display_name": "Agentic Chat (GPT-5.6 Sol)", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -93344,7 +95757,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -93353,57 +95766,48 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "duo-chat-opus-5", - "name": "Agentic Chat (Claude Opus 5)", - "display_name": "Agentic Chat (Claude Opus 5)", + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8191, + "output": 1536 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", - "type": "chat" - } - ] - }, - "bailing": { - "id": "bailing", - "name": "Bailing", - "display_name": "Bailing", - "api": "https://api.tbox.cn/api/llm/v1/chat/completions", - "doc": "https://alipaytbox.yuque.com/sxs0ba/ling/intro", - "models": [ + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" + }, { - "id": "Ling-1T", - "name": "Ling-1T", - "display_name": "Ling-1T", + "id": "cohere-embed-v3-english", + "name": "Embed v3 English", + "display_name": "Embed v3 English", "modalities": { "input": [ "text" @@ -93413,28 +95817,28 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 512, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-10", - "last_updated": "2025-10", + "release_date": "2023-11-07", + "last_updated": "2023-11-07", "type": "chat" }, { - "id": "Ring-1T", - "name": "Ring-1T", - "display_name": "Ring-1T", + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "display_name": "Llama 4 Scout 17B 16E Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -93442,65 +95846,24 @@ }, "limit": { "context": 128000, - "output": 32000 + "output": 8192 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-10", - "last_updated": "2025-10", - "type": "chat" - } - ] - }, - "venice": { - "id": "venice", - "name": "Venice AI", - "display_name": "Venice AI", - "doc": "https://docs.venice.ai", - "models": [ - { - "id": "olafangensan-glm-4.7-flash-heretic", - "name": "GLM 4.7 Flash Heretic", - "display_name": "GLM 4.7 Flash Heretic", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 24000 - }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-04", - "last_updated": "2026-06-11", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct-turbo", - "name": "Qwen 3 Coder 480B Turbo", - "display_name": "Qwen 3 Coder 480B Turbo", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", "modalities": { "input": [ "text" @@ -93510,35 +95873,34 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 8191, + "output": 3072 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-06-11", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "grok-4-5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "cohere-command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 32000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -93546,16 +95908,17 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-07", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", @@ -93566,54 +95929,40 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-06-11", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "grok-build-0-1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -93624,124 +95973,25 @@ ] }, "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-06-11", - "type": "chat" - }, - { - "id": "qwen3-5-397b-a17b", - "name": "Qwen 3.5 397B", - "display_name": "Qwen 3.5 397B", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-16", - "last_updated": "2026-06-11", - "type": "chat" - }, - { - "id": "openai-gpt-54-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-06-11", - "type": "chat" - }, - { - "id": "minimax-m25", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 198000, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-06-11", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "llama-3.3-70b", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "cohere-embed-v3-multilingual", + "name": "Embed v3 Multilingual", + "display_name": "Embed v3 Multilingual", "modalities": { "input": [ "text" @@ -93751,23 +96001,24 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 512, + "output": 1024 }, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-04-06", - "last_updated": "2026-06-11", + "release_date": "2023-11-07", + "last_updated": "2023-11-07", "type": "chat" }, { - "id": "nvidia-nemotron-3-ultra-550b-a55b", - "name": "NVIDIA Nemotron 3 Ultra", - "display_name": "NVIDIA Nemotron 3 Ultra", + "id": "codestral-2501", + "name": "Codestral 25.01", + "display_name": "Codestral 25.01", "modalities": { "input": [ "text" @@ -93778,24 +96029,24 @@ }, "limit": { "context": 256000, - "output": 32768 + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2024-03", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "mistral-small-3-2-24b-instruct", - "name": "Mistral Small 3.2 24B Instruct", - "display_name": "Mistral Small 3.2 24B Instruct", + "id": "gpt-3.5-turbo-0125", + "name": "GPT-3.5 Turbo 0125", + "display_name": "GPT-3.5 Turbo 0125", "modalities": { "input": [ "text" @@ -93805,84 +96056,97 @@ ] }, "limit": { - "context": 256000, + "context": 16384, "output": 16384 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-01-15", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", "type": "chat" }, { - "id": "gemini-3-5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "display_name": "GPT-3.5 Turbo Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-22", - "last_updated": "2026-06-11", + "knowledge": "2021-08", + "release_date": "2023-09-21", + "last_updated": "2023-09-21", "type": "chat" }, { - "id": "minimax-m3-preview", - "name": "MiniMax M3 Preview", - "display_name": "MiniMax M3 Preview", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 200000, + "output": 100000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "openai-gpt-55", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -93893,8 +96157,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -93902,44 +96166,92 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-06-11", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gemma-4-uncensored", - "name": "Gemma 4 Uncensored", - "display_name": "Gemma 4 Uncensored", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ - "text" + "text", + "image", + "audio" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-13", - "last_updated": "2026-06-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "aion-labs-aion-3-0", - "name": "Aion 3.0", - "display_name": "Aion 3.0", + "id": "phi-4-mini", + "name": "Phi-4-mini", + "display_name": "Phi-4-mini", "modalities": { "input": [ "text" @@ -93950,26 +96262,28 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 4096 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen 3 235B A22B Thinking 2507", - "display_name": "Qwen 3 235B A22B Thinking 2507", + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -93977,48 +96291,41 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 4096 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2026-06-11", + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ - "text" + "text", + "image", + "audio" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -94028,41 +96335,34 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-06-11", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "qwen3-5-9b", - "name": "Qwen 3.5 9B", - "display_name": "Qwen 3.5 9B", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -94073,66 +96373,76 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-05", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "phi-4-reasoning-plus", + "name": "Phi-4-reasoning-plus", + "display_name": "Phi-4-reasoning-plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-06-11", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -94143,7 +96453,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -94157,68 +96467,33 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-10", - "last_updated": "2026-06-11", - "type": "chat" - }, - { - "id": "openai-gpt-54-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-27", - "last_updated": "2026-06-11", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ "text" @@ -94228,11 +96503,11 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 163840, + "output": 163840 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -94250,15 +96525,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-06-11", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -94269,7 +96544,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -94283,51 +96558,48 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-06-11", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "zai-org-glm-5", - "name": "GLM 5", - "display_name": "GLM 5", + "id": "o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 32000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -94336,24 +96608,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "openai-gpt-56-luna-pro", - "name": "GPT-5.6 Luna Pro", - "display_name": "GPT-5.6 Luna Pro", + "id": "mistral-small-2503", + "name": "Mistral Small 3.1", + "display_name": "Mistral Small 3.1", "modalities": { "input": [ "text", @@ -94364,26 +96640,25 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09", + "release_date": "2025-03-01", + "last_updated": "2025-03-01", "type": "chat" }, { - "id": "venice-uncensored-1-2", - "name": "Venice Uncensored 1.2", - "display_name": "Venice Uncensored 1.2", + "id": "cohere-embed-v-4-0", + "name": "Embed v4", + "display_name": "Embed v4", "modalities": { "input": [ "text", @@ -94395,26 +96670,26 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 1536 }, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-06-11", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b", - "name": "Qwen3 VL 235B", - "display_name": "Qwen3 VL 235B", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -94422,65 +96697,75 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-01-16", - "last_updated": "2026-06-11", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "gemini-3-5-flash-lite", - "name": "Gemini 3.5 Flash-Lite", - "display_name": "Gemini 3.5 Flash-Lite", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-09", - "last_updated": "2026-07-21", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "qwen3-6-35b-a3b", - "name": "Qwen 3.6 35B A3B", - "display_name": "Qwen 3.6 35B A3B", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -94491,8 +96776,58 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", + "type": "chat" + }, + { + "id": "phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "display_name": "Phi-4-mini-reasoning", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -94500,16 +96835,17 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-20", - "last_updated": "2026-07-22", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "google-gemma-3-27b-it", - "name": "Google Gemma 3 27B Instruct", - "display_name": "Google Gemma 3 27B Instruct", + "id": "gpt-4-turbo-vision", + "name": "GPT-4 Turbo Vision", + "display_name": "GPT-4 Turbo Vision", "modalities": { "input": [ "text", @@ -94520,23 +96856,25 @@ ] }, "limit": { - "context": 198000, - "output": 16384 + "context": 128000, + "output": 4096 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-11-04", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "minimax-m27", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -94546,38 +96884,39 @@ ] }, "limit": { - "context": 198000, + "context": 128000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-06-11", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "zai-org-glm-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -94586,78 +96925,64 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2024-04-01", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "phi-4-reasoning", + "name": "Phi-4-reasoning", + "display_name": "Phi-4-reasoning", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-19", - "last_updated": "2026-06-11", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "openai-gpt-4o-mini-2024-07-18", - "name": "GPT-4o Mini", - "display_name": "GPT-4o Mini", + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -94669,7 +96994,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -94678,15 +97003,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2026-02-28", - "last_updated": "2026-06-11", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "openai-gpt-54", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -94697,8 +97022,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -94706,22 +97031,42 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-06-11", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen-3-7-max", - "name": "Qwen 3.7 Max", - "display_name": "Qwen 3.7 Max", + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -94729,67 +97074,66 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-22", - "last_updated": "2026-06-11", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "qwen-3-7-plus", - "name": "Qwen 3.7 Plus", - "display_name": "Qwen 3.7 Plus", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-11", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "kimi-k2-7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -94797,99 +97141,109 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-13", - "last_updated": "2026-06-16", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen-3-6-plus", - "name": "Qwen 3.6 Plus Uncensored", - "display_name": "Qwen 3.6 Plus Uncensored", + "id": "ministral-3b", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-06", - "last_updated": "2026-06-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-03", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 64000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-01-15", - "last_updated": "2026-06-11", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "openai-gpt-4o-2024-11-20", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "model-router", + "name": "Model Router", + "display_name": "Model Router", "modalities": { "input": [ "text", @@ -94900,25 +97254,23 @@ ] }, "limit": { - "context": 128000, + "context": 200000, "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2026-02-28", - "last_updated": "2026-06-11", + "release_date": "2025-05-19", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "phi-4", + "name": "Phi-4", + "display_name": "Phi-4", "modalities": { "input": [ "text" @@ -94928,37 +97280,25 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-06-11", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "openai-gpt-52", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "deepseek-v3.2-speciale", + "name": "DeepSeek-V3.2-Speciale", + "display_name": "DeepSeek-V3.2-Speciale", "modalities": { "input": [ "text" @@ -94968,55 +97308,54 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 128000, + "output": 128000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-13", - "last_updated": "2026-06-11", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "grok-4-3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "gpt-3.5-turbo-1106", + "name": "GPT-3.5 Turbo 1106", + "display_name": "GPT-3.5 Turbo 1106", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-18", - "last_updated": "2026-06-11", + "knowledge": "2021-08", + "release_date": "2023-11-06", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "kimi-k2-5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", @@ -95027,37 +97366,25 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, "knowledge": "2024-04", - "release_date": "2026-01-27", - "last_updated": "2026-06-11", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "nvidia-nemotron-3-nano-30b-a3b", - "name": "NVIDIA Nemotron 3 Nano 30B", - "display_name": "NVIDIA Nemotron 3 Nano 30B", + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "display_name": "text-embedding-ada-002", "modalities": { "input": [ "text" @@ -95066,25 +97393,54 @@ "text" ] }, + "limit": { + "context": 8192, + "output": 1536 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "type": "embedding" + }, + { + "id": "phi-4-multimodal", + "name": "Phi-4-multimodal", + "display_name": "Phi-4-multimodal", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, "limit": { "context": 128000, - "output": 16384 + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-06-11", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "zai-org-glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "codex-mini", + "name": "Codex Mini", + "display_name": "Codex Mini", "modalities": { "input": [ "text" @@ -95094,29 +97450,30 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-29", - "last_updated": "2026-06-11", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-05-16", + "last_updated": "2025-05-16", "type": "chat" }, { - "id": "llama-3.2-3b", - "name": "Llama 3.2 3B", - "display_name": "Llama 3.2 3B", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -95124,22 +97481,24 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-10-03", - "last_updated": "2026-06-11", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "openai-gpt-55-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", @@ -95150,58 +97509,85 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-24", - "last_updated": "2026-06-11", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "display_name": "GPT-5.1 Codex Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, "open_weights": false, - "release_date": "2026-07-31", - "last_updated": "2026-08-01", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" - }, + } + ] + }, + "clarifai": { + "id": "clarifai", + "name": "Clarifai", + "display_name": "Clarifai", + "api": "https://api.clarifai.com/v2/ext/openai/v1", + "doc": "https://docs.clarifai.com/compute/inference/", + "models": [ { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen 3 235B A22B Instruct 2507", - "display_name": "Qwen 3 235B A22B Instruct 2507", + "id": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ "text" @@ -95211,35 +97597,36 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2026-06-11", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -95247,17 +97634,27 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-06-11", + "release_date": "2025-07-31", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "aion-labs-aion-3-0-mini", - "name": "Aion 3.0 Mini", - "display_name": "Aion 3.0 Mini", + "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ "text" @@ -95267,24 +97664,24 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "open_weights": true, + "release_date": "2025-07-30", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "claude-opus-5-fast", - "name": "Claude Opus 5 Fast", - "display_name": "Claude Opus 5 Fast", + "id": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", + "name": "Ministral 3 3B Reasoning 2512", + "display_name": "Ministral 3 3B Reasoning 2512", "modalities": { "input": [ "text", @@ -95295,58 +97692,55 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-23", - "last_updated": "2026-07-24", + "open_weights": true, + "release_date": "2025-12", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", + "name": "Ministral 3 14B Reasoning 2512", + "display_name": "Ministral 3 14B Reasoning 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 160000, - "output": 32768 + "context": 262144, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-12-04", - "last_updated": "2026-06-11", + "knowledge": "2025-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "qwen3-6-27b", - "name": "Qwen 3.6 27B", - "display_name": "Qwen 3.6 27B", + "id": "clarifai/main/models/mm-poly-8b", + "name": "MM Poly 8B", + "display_name": "MM Poly 8B", "modalities": { "input": [ "text", @@ -95358,25 +97752,24 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 32768, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-06-11", + "release_date": "2025-06", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "openai-gpt-56-sol-pro", - "name": "GPT-5.6 Sol Pro", - "display_name": "GPT-5.6 Sol Pro", + "id": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", + "name": "DeepSeek OCR", + "display_name": "DeepSeek OCR", "modalities": { "input": [ "text", @@ -95387,26 +97780,24 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2025-10-20", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "hermes-3-llama-3.1-405b", - "name": "Hermes 3 Llama 3.1 405b", - "display_name": "Hermes 3 Llama 3.1 405b", + "id": "arcee_ai/AFM/models/trinity-mini", + "name": "Trinity Mini", + "display_name": "Trinity Mini", "modalities": { "input": [ "text" @@ -95416,34 +97807,38 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-09-25", - "last_updated": "2026-06-11", + "knowledge": "2024-10", + "release_date": "2025-12", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "z-ai-glm-5-turbo", - "name": "GLM 5 Turbo", - "display_name": "GLM 5 Turbo", + "id": "moonshotai/chat-completion/models/Kimi-K2_6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -95451,56 +97846,72 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-03-15", - "last_updated": "2026-06-11", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "venice-uncensored-role-play", - "name": "Venice Role Play Uncensored", - "display_name": "Venice Role Play Uncensored", + "id": "openai/chat-completion/models/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-02-20", - "last_updated": "2026-06-11", + "release_date": "2025-08-05", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "google-gemma-4-26b-a4b-it", - "name": "Google Gemma 4 26B A4B Instruct", - "display_name": "Google Gemma 4 26B A4B Instruct", + "id": "openai/chat-completion/models/gpt-oss-120b-high-throughput", + "name": "GPT OSS 120B High Throughput", + "display_name": "GPT OSS 120B High Throughput", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -95508,29 +97919,27 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-06-11", + "release_date": "2025-08-05", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "google-gemma-4-31b-it", - "name": "Google Gemma 4 31B Instruct", - "display_name": "Google Gemma 4 31B Instruct", + "id": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", + "name": "MiniMax-M2.5 High Throughput", + "display_name": "MiniMax-M2.5 High Throughput", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -95538,16 +97947,25 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-03", - "last_updated": "2026-06-11", + "release_date": "2026-02-12", + "last_updated": "2026-02-25", "type": "chat" - }, + } + ] + }, + "iflowcn": { + "id": "iflowcn", + "name": "iFlow", + "display_name": "iFlow", + "api": "https://apis.iflow.cn/v1", + "doc": "https://platform.iflow.cn/en/docs", + "models": [ { - "id": "openai-gpt-52-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "qwen3-vl-plus", + "name": "Qwen3-VL-Plus", + "display_name": "Qwen3-VL-Plus", "modalities": { "input": [ "text", @@ -95559,68 +97977,85 @@ }, "limit": { "context": 256000, - "output": 65536 + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08", - "release_date": "2025-01-15", - "last_updated": "2026-06-11", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "seed-2-1-turbo", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "qwen3-32b", + "name": "Qwen3-32B", + "display_name": "Qwen3-32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 128000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-28", - "last_updated": "2026-07-24", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "xiaomi-mimo-v2-5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3-235B-A22B-Thinking", + "display_name": "Qwen3-235B-A22B-Thinking", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -95628,45 +98063,57 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-06-11", - "last_updated": "2026-06-11", + "knowledge": "2025-04", + "release_date": "2025-07-01", + "last_updated": "2025-07-01", "type": "chat" }, { - "id": "grok-4-20-multi-agent", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", + "id": "qwen3-235b", + "name": "Qwen3-235B-A22B", + "display_name": "Qwen3-235B-A22B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 128000, + "output": 32000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-12", - "last_updated": "2026-06-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "qwen3-next-80b", - "name": "Qwen 3 Next 80b", - "display_name": "Qwen 3 Next 80b", + "id": "qwen3-max-preview", + "name": "Qwen3-Max-Preview", + "display_name": "Qwen3-Max-Preview", "modalities": { "input": [ "text" @@ -95677,57 +98124,111 @@ }, "limit": { "context": 256000, - "output": 16384 + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2026-06-11", + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "openai-gpt-56-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "qwen3-max", + "name": "Qwen3-Max", + "display_name": "Qwen3-Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, + "context": 256000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "type": "chat" + }, + { + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 128000 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen3-5-35b-a3b", - "name": "Qwen 3.5 35B A3B", - "display_name": "Qwen 3.5 35B A3B", + "id": "qwen3-coder-plus", + "name": "Qwen3-Coder-Plus", + "display_name": "Qwen3-Coder-Plus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -95735,56 +98236,52 @@ }, "limit": { "context": 256000, - "output": 16384 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-25", - "last_updated": "2026-06-11", + "knowledge": "2025-04", + "release_date": "2025-07-01", + "last_updated": "2025-07-01", "type": "chat" }, { - "id": "gemini-3-6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "deepseek-v3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-09", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "zai-org-glm-5-2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2-Exp", + "display_name": "DeepSeek-V3.2-Exp", "modalities": { "input": [ "text" @@ -95794,39 +98291,43 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95834,105 +98335,149 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-17", + "knowledge": "2024-12", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "kimi-k2", + "name": "Kimi-K2", + "display_name": "Kimi-K2", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", + "type": "chat" + }, + { + "id": "qwen3-235b-a22b-instruct", + "name": "Qwen3-235B-A22B-Instruct", + "display_name": "Qwen3-235B-A22B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-17", + "knowledge": "2025-04", + "release_date": "2025-07-01", + "last_updated": "2025-07-01", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "kimi-k2-0905", + "name": "Kimi-K2-0905", + "display_name": "Kimi-K2-0905", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "type": "chat" + } + ] + }, + "gitlab": { + "id": "gitlab", + "name": "GitLab Duo", + "display_name": "GitLab Duo", + "doc": "https://docs.gitlab.com/user/duo_agent_platform/", + "models": [ + { + "id": "duo-chat-gpt-5-5", + "name": "Agentic Chat (GPT-5.5)", + "display_name": "Agentic Chat (GPT-5.5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-06-11", + "knowledge": "2025-08-31", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "duo-chat-gpt-5-codex", + "name": "Agentic Chat (GPT-5 Codex)", + "display_name": "Agentic Chat (GPT-5 Codex)", "modalities": { "input": [ "text", @@ -95943,128 +98488,88 @@ ] }, "limit": { - "context": 198000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-12-06", - "last_updated": "2026-06-11", + "knowledge": "2024-09-30", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "duo-chat-haiku-4-5", + "name": "Agentic Chat (Claude Haiku 4.5)", + "display_name": "Agentic Chat (Claude Haiku 4.5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-29", - "last_updated": "2026-07-01", + "knowledge": "2025-02-28", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", "type": "chat" }, { - "id": "zai-org-glm-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "duo-chat-opus-4-8", + "name": "Agentic Chat (Claude Opus 4.8)", + "display_name": "Agentic Chat (Claude Opus 4.8)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-24", - "last_updated": "2026-06-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "grok-4-20", - "name": "Grok 4.20", - "display_name": "Grok 4.20", + "id": "duo-chat-gpt-5-1", + "name": "Agentic Chat (GPT-5.1)", + "display_name": "Agentic Chat (GPT-5.1)", "modalities": { "input": [ "text", @@ -96075,9 +98580,10 @@ ] }, "limit": { - "context": 2000000, + "context": 400000, "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -96085,26 +98591,28 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-12", - "last_updated": "2026-06-11", + "knowledge": "2024-09-30", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", "type": "chat" }, { - "id": "z-ai-glm-5v-turbo", - "name": "GLM 5V Turbo", - "display_name": "GLM 5V Turbo", + "id": "duo-chat-opus-4-6", + "name": "Agentic Chat (Claude Opus 4.6)", + "display_name": "Agentic Chat (Claude Opus 4.6)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -96114,25 +98622,27 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-06-11", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "openai-gpt-56-terra-pro", - "name": "GPT-5.6 Terra Pro", - "display_name": "GPT-5.6 Terra Pro", + "id": "duo-chat-gpt-5-6-terra", + "name": "Agentic Chat (GPT-5.6 Terra)", + "display_name": "Agentic Chat (GPT-5.6 Terra)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -96149,13 +98659,14 @@ "type": "chat" }, { - "id": "openai-gpt-53-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "duo-chat-gpt-5-2-codex", + "name": "Agentic Chat (GPT-5.2 Codex)", + "display_name": "Agentic Chat (GPT-5.2 Codex)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -96174,25 +98685,26 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-06-11", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", "type": "chat" }, { - "id": "openai-gpt-56-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "duo-chat-gpt-5-6-luna", + "name": "Agentic Chat (GPT-5.6 Luna)", + "display_name": "Agentic Chat (GPT-5.6 Luna)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -96209,75 +98721,82 @@ "type": "chat" }, { - "id": "mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", + "id": "duo-chat-sonnet-4-6", + "name": "Agentic Chat (Claude Sonnet 4.6)", + "display_name": "Agentic Chat (Claude Sonnet 4.6)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 1000000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-20", - "last_updated": "2026-06-11", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" }, { - "id": "openai-gpt-oss-120b", - "name": "OpenAI GPT OSS 120B", - "display_name": "OpenAI GPT OSS 120B", + "id": "duo-chat-gpt-5-mini", + "name": "Agentic Chat (GPT-5 Mini)", + "display_name": "Agentic Chat (GPT-5 Mini)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-11-06", - "last_updated": "2026-06-11", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "duo-chat-gpt-5-3-codex", + "name": "Agentic Chat (GPT-5.3 Codex)", + "display_name": "Agentic Chat (GPT-5.3 Codex)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -96286,61 +98805,47 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-23", - "last_updated": "2026-07-24", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "zai-org-glm-5-1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "duo-chat-gpt-5-4-nano", + "name": "Agentic Chat (GPT-5.4 Nano)", + "display_name": "Agentic Chat (GPT-5.4 Nano)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 80000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-06-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "claude-opus-4-8-fast", - "name": "Claude Opus 4.8 Fast", - "display_name": "Claude Opus 4.8 Fast", + "id": "duo-chat-gpt-5-4-mini", + "name": "Agentic Chat (GPT-5.4 Mini)", + "display_name": "Agentic Chat (GPT-5.4 Mini)", "modalities": { "input": [ "text", @@ -96351,52 +98856,26 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-06-11", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai-gpt-56-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "duo-chat-gpt-5-2", + "name": "Agentic Chat (GPT-5.2)", + "display_name": "Agentic Chat (GPT-5.2)", "modalities": { "input": [ "text", @@ -96407,7 +98886,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -96418,21 +98897,20 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "gemini-3-1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "duo-chat-fable-5", + "name": "Agentic Chat (Claude Fable 5)", + "display_name": "Agentic Chat (Claude Fable 5)", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" @@ -96440,9 +98918,9 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -96450,74 +98928,59 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-06-11", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" - } - ] - }, - "mixlayer": { - "id": "mixlayer", - "name": "Mixlayer", - "display_name": "Mixlayer", - "api": "https://models.mixlayer.ai/v1", - "doc": "https://docs.mixlayer.com", - "models": [ + }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "duo-chat-gpt-5-4", + "name": "Agentic Chat (GPT-5.4)", + "display_name": "Agentic Chat (GPT-5.4)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "duo-chat-sonnet-4-5", + "name": "Agentic Chat (Claude Sonnet 4.5)", + "display_name": "Agentic Chat (Claude Sonnet 4.5)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -96525,116 +98988,92 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B", - "display_name": "Qwen3.5 35B A3B", + "id": "duo-chat-opus-4-7", + "name": "Agentic Chat (Claude Opus 4.7)", + "display_name": "Agentic Chat (Claude Opus 4.7)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "duo-chat-sonnet-5", + "name": "Agentic Chat (Claude Sonnet 5)", + "display_name": "Agentic Chat (Claude Sonnet 5)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B", - "display_name": "Qwen3.5 122B A10B", + "id": "duo-chat-opus-4-5", + "name": "Agentic Chat (Claude Opus 4.5)", + "display_name": "Agentic Chat (Claude Opus 4.5)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -96642,106 +99081,88 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", "type": "chat" - } - ] - }, - "scaleway": { - "id": "scaleway", - "name": "Scaleway", - "display_name": "Scaleway", - "api": "https://api.scaleway.ai/v1", - "doc": "https://www.scaleway.com/en/docs/generative-apis/", - "models": [ + }, { - "id": "mistral-medium-3.5-128b", - "name": "Mistral Medium 3.5 128B", - "display_name": "Mistral Medium 3.5 128B", + "id": "duo-chat-gpt-5-6-sol", + "name": "Agentic Chat (GPT-5.6 Sol)", + "display_name": "Agentic Chat (GPT-5.6 Sol)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "duo-chat-opus-5", + "name": "Agentic Chat (Claude Opus 5)", + "display_name": "Agentic Chat (Claude Opus 5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-05-01", - "last_updated": "2026-05-22", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" - }, + } + ] + }, + "bailing": { + "id": "bailing", + "name": "Bailing", + "display_name": "Bailing", + "api": "https://api.tbox.cn/api/llm/v1/chat/completions", + "doc": "https://alipaytbox.yuque.com/sxs0ba/ling/intro", + "models": [ { - "id": "bge-multilingual-gemma2", - "name": "BGE Multilingual Gemma2", - "display_name": "BGE Multilingual Gemma2", + "id": "Ling-1T", + "name": "Ling-1T", + "display_name": "Ling-1T", "modalities": { "input": [ "text" @@ -96751,24 +99172,25 @@ ] }, "limit": { - "context": 8191, - "output": 3072 + "context": 128000, + "output": 32000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-07-26", - "last_updated": "2025-06-15", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-10", + "last_updated": "2025-10", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "Ring-1T", + "name": "Ring-1T", + "display_name": "Ring-1T", "modalities": { "input": [ "text" @@ -96779,24 +99201,38 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2026-03-17", + "knowledge": "2024-06", + "release_date": "2025-10", + "last_updated": "2025-10", "type": "chat" - }, + } + ] + }, + "venice": { + "id": "venice", + "name": "Venice AI", + "display_name": "Venice AI", + "doc": "https://docs.venice.ai", + "models": [ { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "olafangensan-glm-4.7-flash-heretic", + "name": "GLM 4.7 Flash Heretic", + "display_name": "GLM 4.7 Flash Heretic", "modalities": { "input": [ "text" @@ -96806,59 +99242,50 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 200000, + "output": 24000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-02-04", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "pixtral-12b-2409", - "name": "Pixtral 12B 2409", - "display_name": "Pixtral 12B 2409", + "id": "qwen3-coder-480b-a35b-instruct-turbo", + "name": "Qwen 3 Coder 480B Turbo", + "display_name": "Qwen 3 Coder 480B Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-09-25", - "last_updated": "2026-03-17", + "release_date": "2026-01-27", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "grok-4-5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -96869,8 +99296,8 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 500000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -96878,89 +99305,116 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-01", - "last_updated": "2026-05-22", + "open_weights": false, + "release_date": "2026-07-07", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 100000, - "output": 16384 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2026-03-17", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "whisper-large-v3", - "name": "Whisper Large v3", - "display_name": "Whisper Large v3", + "id": "grok-build-0-1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-09", - "release_date": "2023-09-01", - "last_updated": "2026-03-17", + "attachment": true, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "qwen3-5-397b-a17b", + "name": "Qwen 3.5 397B", + "display_name": "Qwen 3.5 397B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 260000, - "output": 16384 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -96968,92 +99422,87 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-01", - "last_updated": "2026-03-17", + "release_date": "2026-02-16", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "openai-gpt-54-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2026-03-17", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "Mistral Small 3.2 24B Instruct (2506)", - "display_name": "Mistral Small 3.2 24B Instruct (2506)", + "id": "qwen-3-8-max", + "name": "Qwen 3.8 Max", + "display_name": "Qwen 3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2026-03-17", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-22", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "minimax-m25", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 198000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -97072,17 +99521,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-02-12", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen3-embedding-8b", - "name": "Qwen3 Embedding 8B", - "display_name": "Qwen3 Embedding 8B", + "id": "llama-3.3-70b", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ "text" @@ -97092,32 +99540,23 @@ ] }, "limit": { - "context": 32768, + "context": 128000, "output": 4096 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2026-03-17", - "type": "embedding" - } - ] - }, - "togetherai": { - "id": "togetherai", - "name": "Together AI", - "display_name": "Together AI", - "doc": "https://docs.together.ai/docs/serverless-models", - "models": [ + "open_weights": true, + "release_date": "2025-04-06", + "last_updated": "2026-06-11", + "type": "chat" + }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "nvidia-nemotron-3-ultra-550b-a55b", + "name": "NVIDIA Nemotron 3 Ultra", + "display_name": "NVIDIA Nemotron 3 Ultra", "modalities": { "input": [ "text" @@ -97127,8 +99566,8 @@ ] }, "limit": { - "context": 512300, - "output": 512300 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -97136,21 +99575,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepcogito/cogito-v2-1-671b", - "name": "Cogito v2.1 671B", - "display_name": "Cogito v2.1 671B", + "id": "mistral-small-3-2-24b-instruct", + "name": "Mistral Small 3.2 24B Instruct", + "display_name": "Mistral Small 3.2 24B Instruct", "modalities": { "input": [ "text" @@ -97160,156 +99594,141 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 256000, + "output": 16384 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-01-15", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "google/gemma-3n-E4B-it", - "name": "Gemma 3N E4B Instruct", - "display_name": "Gemma 3N E4B Instruct", + "id": "gemini-3-5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-22", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B Instruct", - "display_name": "Gemma 4 31B Instruct", + "id": "minimax-m3-preview", + "name": "MiniMax M3 Preview", + "display_name": "MiniMax M3 Preview", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 524288, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-06-12", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "thinkingmachines/Inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "openai-gpt-55", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, + "context": 1000000, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "gemma-4-uncensored", + "name": "Gemma 4 Uncensored", + "display_name": "Gemma 4 Uncensored", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 256000, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2026-04-13", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "aion-labs-aion-3-0", + "name": "Aion 3.0", + "display_name": "Aion 3.0", "modalities": { "input": [ "text" @@ -97319,36 +99738,24 @@ ] }, "limit": { - "context": 262144, - "output": 164000 + "context": 128000, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen 3 235B A22B Thinking 2507", + "display_name": "Qwen 3 235B A22B Thinking 2507", "modalities": { "input": [ "text" @@ -97358,10 +99765,9 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -97369,81 +99775,112 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-11", - "release_date": "2026-04-07", - "last_updated": "2026-07-02", + "release_date": "2025-04-29", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "pearl-ai/gemma-4-31b-it", - "name": "Pearl AI Gemma 4 31B Instruct", - "display_name": "Pearl AI Gemma 4 31B Instruct", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 1000000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "essentialai/Rnj-1-Instruct", - "name": "Rnj-1 Instruct", - "display_name": "Rnj-1 Instruct", + "id": "qwen3-5-9b", + "name": "Qwen 3.5 9B", + "display_name": "Qwen 3.5 9B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 256000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-12-05", - "last_updated": "2025-12-05", + "release_date": "2026-03-05", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "kimi-k2-6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -97454,7 +99891,7 @@ ] }, "limit": { - "context": 262144, + "context": 256000, "output": 65536 }, "temperature": true, @@ -97476,70 +99913,101 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-10", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-Next-FP8", - "name": "Qwen3 Coder Next FP8", - "display_name": "Qwen3 Coder Next FP8", + "id": "openai-gpt-54-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-02-03", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-27", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen3.7-Max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash 0423", + "display_name": "DeepSeek V4 Flash 0423", "modalities": { "input": [ "text" @@ -97550,56 +100018,36 @@ }, "limit": { "context": 1000000, - "output": 500000 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-07-02", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", - "name": "Qwen3 235B A22B Instruct 2507 FP8", - "display_name": "Qwen3 235B A22B Instruct 2507 FP8", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -97610,36 +100058,52 @@ ] }, "limit": { - "context": 262144, - "output": 130000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-16", - "last_updated": "2026-06-15", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen3.6-Plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "zai-org-glm-5", + "name": "GLM 5", + "display_name": "GLM 5", "modalities": { "input": [ "text" @@ -97649,8 +100113,8 @@ ] }, "limit": { - "context": 1000000, - "output": 500000 + "context": 198000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -97671,85 +100135,87 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2026-02-11", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "Qwen/Qwen2.5-7B-Instruct-Turbo", - "name": "Qwen 2.5 7B Instruct Turbo", - "display_name": "Qwen 2.5 7B Instruct Turbo", + "id": "openai-gpt-56-luna-pro", + "name": "GPT-5.6 Luna Pro", + "display_name": "GPT-5.6 Luna Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "LiquidAI/LFM2-24B-A2B", - "name": "LFM2-24B-A2B", - "display_name": "LFM2-24B-A2B", + "id": "venice-uncensored-1-2", + "name": "Venice Uncensored 1.2", + "display_name": "Venice Uncensored 1.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 128000, + "output": 8192 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-25", - "last_updated": "2026-02-25", + "release_date": "2026-04-01", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3 VL 235B", + "display_name": "Qwen3 VL 235B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -97762,27 +100228,30 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-01-16", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "gemini-3-5-flash-lite", + "name": "Gemini 3.5 Flash-Lite", + "display_name": "Gemini 3.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -97790,21 +100259,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-09", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "qwen3-6-35b-a3b", + "name": "Qwen 3.6 35B A3B", + "display_name": "Qwen 3.6 35B A3B", "modalities": { "input": [ "text", @@ -97815,8 +100280,8 @@ ] }, "limit": { - "context": 524288, - "output": 250000 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -97824,49 +100289,43 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-20", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", + "id": "google-gemma-3-27b-it", + "name": "Google Gemma 3 27B Instruct", + "display_name": "Google Gemma 3 27B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 198000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-12-26", - "last_updated": "2025-05-29", + "release_date": "2025-11-04", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "minimax-m27", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ "text" @@ -97876,37 +100335,25 @@ ] }, "limit": { - "context": 163839, - "output": 163839 + "context": 198000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-03-24", + "release_date": "2026-03-18", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "zai-org-glm-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", "modalities": { "input": [ "text" @@ -97916,8 +100363,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 198000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -97925,28 +100372,43 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2025-04", + "release_date": "2024-04-01", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 384000 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -97957,6 +100419,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -97965,52 +100436,46 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-19", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai-gpt-4o-mini-2024-07-18", + "name": "GPT-4o Mini", + "display_name": "GPT-4o Mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2026-02-28", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai-gpt-54", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -98021,48 +100486,39 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen-3-7-max", + "name": "Qwen 3.7 Max", + "display_name": "Qwen 3.7 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -98070,21 +100526,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-14", - "last_updated": "2026-06-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-05-22", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen-3-7-plus", + "name": "Qwen 3.7 Plus", + "display_name": "Qwen 3.7 Plus", "modalities": { "input": [ "text", @@ -98096,80 +100547,69 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 256000, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2026-06-13", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "qwen-3-6-plus", + "name": "Qwen 3.6 Plus Uncensored", + "display_name": "Qwen 3.6 Plus Uncensored", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -98177,90 +100617,100 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-06", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "meta-llama/Meta-Llama-3-8B-Instruct-Lite", - "name": "Meta Llama 3 8B Instruct Lite", - "display_name": "Meta Llama 3 8B Instruct Lite", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 198000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-04-18", - "last_updated": "2024-04-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-01-15", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "openai-gpt-4o-2024-11-20", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2026-07-02", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2026-02-28", + "last_updated": "2026-06-11", "type": "chat" - } - ] - }, - "digitalocean": { - "id": "digitalocean", - "name": "DigitalOcean", - "display_name": "DigitalOcean", - "api": "https://inference.do-ai.run/v1", - "doc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", - "models": [ + }, { - "id": "anthropic-claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -98268,78 +100718,65 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-28", - "last_updated": "2026-05-29", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-image-1", - "name": "GPT Image 1", - "display_name": "GPT Image 1", + "id": "openai-gpt-52", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 65536 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24", + "knowledge": "2025-08-31", + "release_date": "2025-12-13", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "anthropic-claude-3.5-sonnet", - "name": "Claude 3.5 Sonnet", - "display_name": "Claude 3.5 Sonnet", + "id": "grok-4-3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -98350,37 +100787,39 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1000000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-06-20", - "last_updated": "2024-10-22", + "release_date": "2026-04-18", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "glm-5", - "name": "GLM 5", - "display_name": "GLM 5", + "id": "kimi-k2-5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 128000 + "context": 256000, + "output": 65536 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -98397,46 +100836,44 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-04-16", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2026-01-27", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "nvidia-nemotron-3-nano-30b-a3b", + "name": "NVIDIA Nemotron 3 Nano 30B", + "display_name": "NVIDIA Nemotron 3 Nano 30B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-01-27", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gte-large-en-v1.5", - "name": "GTE Large (v1.5)", - "display_name": "GTE Large (v1.5)", + "id": "zai-org-glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ "text" @@ -98446,24 +100883,26 @@ ] }, "limit": { - "context": 8192, - "output": 1024 + "context": 128000, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2024-03-27", - "last_updated": "2026-04-16", + "knowledge": "2025-04", + "release_date": "2026-01-29", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "mistral-3-14B", - "name": "Ministral 3 14B Instruct", - "display_name": "Ministral 3 14B Instruct", + "id": "llama-3.2-3b", + "name": "Llama 3.2 3B", + "display_name": "Llama 3.2 3B", "modalities": { "input": [ "text" @@ -98473,8 +100912,8 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -98483,14 +100922,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-12-15", - "last_updated": "2026-04-30", + "knowledge": "2023-12", + "release_date": "2024-10-03", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-5.4-pro", - "name": "GPT-5.4 pro", - "display_name": "GPT-5.4 pro", + "id": "openai-gpt-55-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", @@ -98501,7 +100941,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -98512,43 +100952,49 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-12-01", + "release_date": "2026-04-24", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "ministral-3-8b-instruct-2512", - "name": "Ministral 3 8B", - "display_name": "Ministral 3 8B", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-08-01", "type": "chat" }, { - "id": "openai-gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen 3 235B A22B Instruct 2507", + "display_name": "Qwen 3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -98558,37 +101004,36 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2026-04-16", + "release_date": "2025-04-29", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -98596,31 +101041,20 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "nemotron-nano-12b-v2-vl", - "name": "Nemotron Nano 12B v2 VL", - "display_name": "Nemotron Nano 12B v2 VL", + "id": "aion-labs-aion-3-0-mini", + "name": "Aion 3.0 Mini", + "display_name": "Aion 3.0 Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -98628,35 +101062,27 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-12-01", - "last_updated": "2026-04-30", + "attachment": false, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "anthropic-claude-4.5-sonnet", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "claude-opus-5-fast", + "name": "Claude Opus 5 Fast", + "display_name": "Claude Opus 5 Fast", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -98664,9 +101090,9 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -98674,15 +101100,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2026-05", + "release_date": "2026-07-23", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "nvidia-nemotron-3-super-120b", - "name": "Nemotron-3-Super-120B", - "display_name": "Nemotron-3-Super-120B", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -98692,95 +101118,71 @@ ] }, "limit": { - "context": 256000, + "context": 160000, "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2026-02", - "release_date": "2026-03-11", - "last_updated": "2026-04-16", + "release_date": "2025-12-04", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "anthropic-claude-opus-4.5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "qwen3-6-27b", + "name": "Qwen 3.6 27B", + "display_name": "Qwen 3.6 27B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-04-24", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai-gpt-56-sol-pro", + "name": "GPT-5.6 Sol Pro", + "display_name": "GPT-5.6 Sol Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -98788,28 +101190,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-04-16", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "all-mini-lm-l6-v2", - "name": "All-MiniLM-L6-v2", - "display_name": "All-MiniLM-L6-v2", + "id": "hermes-3-llama-3.1-405b", + "name": "Hermes 3 Llama 3.1 405b", + "display_name": "Hermes 3 Llama 3.1 405b", "modalities": { "input": [ "text" @@ -98819,24 +101210,23 @@ ] }, "limit": { - "context": 256, - "output": 384 + "context": 128000, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2021-08-30", - "last_updated": "2026-04-16", + "release_date": "2025-09-25", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "mistral-nemo-instruct-2407", - "name": "Mistral Nemo Instruct", - "display_name": "Mistral Nemo Instruct", + "id": "z-ai-glm-5-turbo", + "name": "GLM 5 Turbo", + "display_name": "GLM 5 Turbo", "modalities": { "input": [ "text" @@ -98846,66 +101236,65 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-03-15", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "venice-uncensored-role-play", + "name": "Venice Role Play Uncensored", + "display_name": "Venice Role Play Uncensored", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "release_date": "2026-02-20", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "google-gemma-4-26b-a4b-it", + "name": "Google Gemma 4 26B A4B Instruct", + "display_name": "Google Gemma 4 26B A4B Instruct", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -98913,154 +101302,111 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-04-02", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "google-gemma-4-31b-it", + "name": "Google Gemma 4 31B Instruct", + "display_name": "Google Gemma 4 31B Instruct", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "release_date": "2026-04-03", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "anthropic-claude-haiku-4.5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "openai-gpt-52-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 256000, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08", + "release_date": "2025-01-15", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "seed-2-1-turbo", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 65536 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "release_date": "2026-06-28", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "anthropic-claude-fable-5", - "name": "Anthropic Claude Fable 5", - "display_name": "Anthropic Claude Fable 5", + "id": "xiaomi-mimo-v2-5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" @@ -99068,7 +101414,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -99076,70 +101422,45 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-09", - "last_updated": "2026-06-12", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-06-11", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen-2.5-14b-instruct", - "name": "Qwen 2.5 14B Instruct", - "display_name": "Qwen 2.5 14B Instruct", + "id": "grok-4-20-multi-agent", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 2000000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-12", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill Llama 70B", - "display_name": "DeepSeek R1 Distill Llama 70B", + "id": "qwen3-next-80b", + "name": "Qwen 3 Next 80b", + "display_name": "Qwen 3 Next 80b", "modalities": { "input": [ "text" @@ -99149,30 +101470,23 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-01-30", - "last_updated": "2025-01-30", + "release_date": "2025-04-29", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "anthropic-claude-3-opus", - "name": "Claude 3 Opus", - "display_name": "Claude 3 Opus", + "id": "openai-gpt-56-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -99183,39 +101497,39 @@ ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2023-08", - "release_date": "2024-02-29", - "last_updated": "2024-02-29", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "nemotron-3-nano-omni", - "name": "Nemotron Nano 3 Omni", - "display_name": "Nemotron Nano 3 Omni", + "id": "qwen3-5-35b-a3b", + "name": "Qwen 3.5 35B A3B", + "display_name": "Qwen 3.5 35B A3B", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -99225,41 +101539,46 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-30", + "release_date": "2026-02-25", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "stable-diffusion-3.5-large", - "name": "Stable Diffusion 3.5 Large", - "display_name": "Stable Diffusion 3.5 Large", + "id": "gemini-3-6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 256, - "output": 1 + "context": 1000000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-10-22", - "last_updated": "2026-04-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-09", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "deepseek-4-flash", - "name": "Deepseek V4 Flash", - "display_name": "Deepseek V4 Flash", + "id": "zai-org-glm-5-2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -99269,29 +101588,29 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-27", - "last_updated": "2026-05-29", + "open_weights": true, + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "openai-gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -99299,7 +101618,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": false, "tool_call": true, @@ -99307,30 +101626,34 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "anthropic-claude-4.1-opus", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -99339,113 +101662,105 @@ "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "anthropic-claude-3.5-haiku", - "name": "Claude 3.5 Haiku", - "display_name": "Claude 3.5 Haiku", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-11-05", - "last_updated": "2024-11-05", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 198000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" - }, - { - "id": "anthropic-claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -99453,22 +101768,22 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-05", + "release_date": "2025-12-06", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-5-mini", - "name": "GPT-5 mini", - "display_name": "GPT-5 mini", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -99479,8 +101794,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, "temperature": false, "tool_call": true, @@ -99488,160 +101803,179 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01-31", + "release_date": "2026-06-29", + "last_updated": "2026-07-01", "type": "chat" }, { - "id": "openai-gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "zai-org-glm-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 198000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-24", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "grok-4-20", + "name": "Grok 4.20", + "display_name": "Grok 4.20", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 2000000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2026-04-30", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-12", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "z-ai-glm-5v-turbo", + "name": "GLM 5V Turbo", + "display_name": "GLM 5V Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 131072 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-12-26", - "last_updated": "2025-03-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "alibaba-qwen3-32b", - "name": "Qwen3-32B", - "display_name": "Qwen3-32B", + "id": "openai-gpt-56-terra-pro", + "name": "GPT-5.6 Terra Pro", + "display_name": "GPT-5.6 Terra Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 40960 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-30", - "last_updated": "2026-04-16", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai-gpt-image-1.5", - "name": "GPT Image 1.5", - "display_name": "GPT Image 1.5", + "id": "openai-gpt-53-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25", + "knowledge": "2025-08-31", + "release_date": "2026-02-24", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "llama-4-maverick", - "name": "Llama 4 Maverick 17B 128E Instruct", - "display_name": "Llama 4 Maverick 17B 128E Instruct", + "id": "openai-gpt-56-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -99653,66 +101987,63 @@ }, "limit": { "context": 1000000, - "output": 16384 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2026-04-30", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai-gpt-5.2-pro", - "name": "GPT-5.2 pro", - "display_name": "GPT-5.2 pro", + "id": "mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 50000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-02-20", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "anthropic-claude-4.5-haiku", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "openai-gpt-oss-120b", + "name": "OpenAI GPT OSS 120B", + "display_name": "OpenAI GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -99720,17 +102051,16 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2025-11-06", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -99741,7 +102071,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -99750,17 +102080,22 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-05", + "release_date": "2026-07-23", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "zai-org-glm-5-1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ "text" @@ -99770,8 +102105,8 @@ ] }, "limit": { - "context": 204800, - "output": 128000 + "context": 200000, + "output": 80000 }, "temperature": true, "tool_call": true, @@ -99781,48 +102116,81 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-08", - "release_date": "2026-02-12", - "last_updated": "2026-04-16", + "release_date": "2026-04-07", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "arcee-trinity-large-thinking", - "name": "Trinity Large Thinking", - "display_name": "Trinity Large Thinking", + "id": "claude-opus-4-8-fast", + "name": "Claude Opus 4.8 Fast", + "display_name": "Claude Opus 4.8 Fast", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-16", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "openai-gpt-56-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -99833,7 +102201,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -99844,30 +102212,31 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai-o1", - "name": "o1", - "display_name": "o1", + "id": "gemini-3-1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -99875,15 +102244,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "openai-gpt-5-nano", - "name": "GPT-5 nano", - "display_name": "GPT-5 nano", + "id": "kimi-k3-fast-api", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ "text", @@ -99894,8 +102263,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -99904,88 +102273,74 @@ "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" - }, + } + ] + }, + "mixlayer": { + "id": "mixlayer", + "name": "Mixlayer", + "display_name": "Mixlayer", + "api": "https://models.mixlayer.ai/v1", + "doc": "https://docs.mixlayer.com", + "models": [ { - "id": "anthropic-claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic-claude-4.6-sonnet", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -99993,17 +102348,27 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "llama3.3-70b-instruct", - "name": "Llama 3.3 Instruct 70B", - "display_name": "Llama 3.3 Instruct 70B", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B", + "display_name": "Qwen3.5 35B A3B", "modalities": { "input": [ "text" @@ -100013,121 +102378,164 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai-gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai-gpt-image-2", - "name": "GPT Image 2", - "display_name": "GPT Image 2", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B", + "display_name": "Qwen3.5 122B A10B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" - }, + } + ] + }, + "scaleway": { + "id": "scaleway", + "name": "Scaleway", + "display_name": "Scaleway", + "api": "https://api.scaleway.ai/v1", + "doc": "https://www.scaleway.com/en/docs/generative-apis/", + "models": [ { - "id": "wan2-2-t2v-a14b", - "name": "Wan2.2-T2V-A14B", - "display_name": "Wan2.2-T2V-A14B", + "id": "mistral-medium-3.5-128b", + "name": "Mistral Medium 3.5 128B", + "display_name": "Mistral Medium 3.5 128B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 100, - "output": 1 + "context": 256000, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2026-04-30", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen 3.5 397B A17B", - "display_name": "Qwen 3.5 397B A17B", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -100146,16 +102554,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-04-30", + "knowledge": "2025-04", + "release_date": "2026-05-01", + "last_updated": "2026-05-22", "type": "chat" }, { - "id": "multi-qa-mpnet-base-dot-v1", - "name": "Multi-QA-mpnet-base-dot-v1", - "display_name": "Multi-QA-mpnet-base-dot-v1", + "id": "bge-multilingual-gemma2", + "name": "BGE Multilingual Gemma2", + "display_name": "BGE Multilingual Gemma2", "modalities": { "input": [ "text" @@ -100165,8 +102574,8 @@ ] }, "limit": { - "context": 512, - "output": 768 + "context": 8191, + "output": 3072 }, "temperature": false, "tool_call": false, @@ -100174,15 +102583,15 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2021-08-30", - "last_updated": "2026-04-16", + "open_weights": false, + "release_date": "2024-07-26", + "last_updated": "2025-06-15", "type": "chat" }, { - "id": "qwen3-embedding-0.6b", - "name": "Qwen3 Embedding 0.6B", - "display_name": "Qwen3 Embedding 0.6B", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -100192,24 +102601,25 @@ ] }, "limit": { - "context": 8000, - "output": 1024 + "context": 128000, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-03", - "last_updated": "2026-04-16", - "type": "embedding" + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2026-03-17", + "type": "chat" }, { - "id": "nemotron-3-ultra-550b", - "name": "Nemotron 3 Ultra", - "display_name": "Nemotron 3 Ultra", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -100219,55 +102629,94 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-06-04", - "last_updated": "2026-06-12", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai-o3", - "name": "o3", - "display_name": "o3", + "id": "pixtral-12b-2409", + "name": "Pixtral 12B 2409", + "display_name": "Pixtral 12B 2409", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2024-09-25", + "last_updated": "2026-03-17", + "type": "chat" + }, + { + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 16384 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-04-01", + "last_updated": "2026-05-22", "type": "chat" }, { - "id": "llama3-8b-instruct", - "name": "Llama 3.1 Instruct (8B)", - "display_name": "Llama 3.1 Instruct (8B)", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -100277,28 +102726,28 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 100000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2024-12-06", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "bge-reranker-v2-m3", - "name": "BGE Reranker v2 M3", - "display_name": "BGE Reranker v2 M3", + "id": "whisper-large-v3", + "name": "Whisper Large v3", + "display_name": "Whisper Large v3", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" @@ -100306,7 +102755,7 @@ }, "limit": { "context": 8192, - "output": 1 + "output": 8192 }, "temperature": false, "tool_call": false, @@ -100315,14 +102764,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2024-03-12", - "last_updated": "2026-04-30", - "type": "rerank" + "knowledge": "2023-09", + "release_date": "2023-09-01", + "last_updated": "2026-03-17", + "type": "chat" }, { - "id": "nemotron-3-nano-30b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -100332,8 +102782,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 260000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -100343,127 +102793,90 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-04", + "release_date": "2025-07-01", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic-claude-3.7-sonnet", - "name": "Claude 3.7 Sonnet", - "display_name": "Claude 3.7 Sonnet", + "id": "gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-11", - "release_date": "2025-02-24", - "last_updated": "2025-02-24", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic-claude-opus-4", - "name": "Claude Opus 4", - "display_name": "Claude Opus 4", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral Small 3.2 24B Instruct (2506)", + "display_name": "Mistral Small 3.2 24B Instruct (2506)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai-gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -100482,137 +102895,85 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2026-04-16", + "knowledge": "2025-04", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic-claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", + "display_name": "Qwen3 Embedding 8B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", - "type": "chat" - }, + "release_date": "2025-06-05", + "last_updated": "2026-03-17", + "type": "embedding" + } + ] + }, + "togetherai": { + "id": "togetherai", + "name": "Together AI", + "display_name": "Together AI", + "doc": "https://docs.together.ai/docs/serverless-models", + "models": [ { - "id": "openai-gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 512300, + "output": 512300 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "gemma-4-31B-it", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-30", - "type": "chat" - }, - { - "id": "openai-o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "deepcogito/cogito-v2-1-671b", + "name": "Cogito v2.1 671B", + "display_name": "Cogito v2.1 671B", "modalities": { "input": [ "text" @@ -100622,26 +102983,25 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 163840, + "output": 163840 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistral-7b-instruct-v0.3", - "name": "Mistral 7B Instruct v0.3", - "display_name": "Mistral 7B Instruct v0.3", + "id": "google/gemma-3n-E4B-it", + "name": "Gemma 3N E4B Instruct", + "display_name": "Gemma 3N E4B Instruct", "modalities": { "input": [ "text" @@ -100655,74 +103015,85 @@ "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-05-22", - "last_updated": "2024-05-22", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "qwen3-tts-voicedesign", - "name": "Qwen3 TTS VoiceDesign", - "display_name": "Qwen3 TTS VoiceDesign", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B Instruct", + "display_name": "Gemma 4 31B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 1 + "context": 262144, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-04-21", - "last_updated": "2026-04-30", + "knowledge": "2025-01", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "e5-large-v2", - "name": "E5 Large v2", - "display_name": "E5 Large v2", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 1024 + "context": 524288, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2023-05-19", - "last_updated": "2026-04-30", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "deepseek-3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -100732,8 +103103,8 @@ ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -100754,15 +103125,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-12-02", - "last_updated": "2026-04-30", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "bge-m3", - "name": "BGE M3", - "display_name": "BGE M3", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -100772,216 +103142,145 @@ ] }, "limit": { - "context": 8192, - "output": 1024 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-30", - "last_updated": "2026-04-30", - "type": "embedding" - }, - { - "id": "openai-gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 164000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "openai-gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 202752, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", - "type": "chat" - }, - { - "id": "fal-ai/fast-sdxl", - "name": "Fast SDXL", - "display_name": "Fast SDXL", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2023-07-26", - "last_updated": "2026-04-16", + "knowledge": "2025-11", + "release_date": "2026-04-07", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "fal-ai/stable-audio-25/text-to-audio", - "name": "Stable Audio 2.5 (Text-to-Audio)", - "display_name": "Stable Audio 2.5 (Text-to-Audio)", + "id": "pearl-ai/gemma-4-31b-it", + "name": "Pearl AI Gemma 4 31B Instruct", + "display_name": "Pearl AI Gemma 4 31B Instruct", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2025-10-08", - "last_updated": "2026-04-16", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "fal-ai/flux/schnell", - "name": "FLUX.1 [schnell]", - "display_name": "FLUX.1 [schnell]", + "id": "essentialai/Rnj-1-Instruct", + "name": "Rnj-1 Instruct", + "display_name": "Rnj-1 Instruct", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32768, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-08-01", - "last_updated": "2026-04-16", + "knowledge": "2024-10", + "release_date": "2025-12-05", + "last_updated": "2025-12-05", "type": "chat" }, { - "id": "fal-ai/elevenlabs/tts/multilingual-v2", - "name": "ElevenLabs Multilingual TTS v2", - "display_name": "ElevenLabs Multilingual TTS v2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2023-08-22", - "last_updated": "2026-04-16", - "type": "chat" - } - ] - }, - "moonshot": { - "id": "moonshot", - "name": "Moonshot AI (China)", - "display_name": "Moonshot AI (China)", - "api": "https://api.moonshot.cn/v1", - "doc": "https://platform.moonshot.cn/docs/api/chat", - "models": [ - { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -101000,14 +103299,14 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ "text" @@ -101023,36 +103322,22 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "Qwen/Qwen3-Coder-Next-FP8", + "name": "Qwen3 Coder Next FP8", + "display_name": "Qwen3 Coder Next FP8", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -101065,33 +103350,19 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2026-02-03", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "kimi-k2-0905-preview", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", + "id": "Qwen/Qwen3.7-Max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -101101,25 +103372,29 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "kimi-k2-turbo-preview", - "name": "Kimi K2 Turbo", - "display_name": "Kimi K2 Turbo", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "name": "Qwen3 235B A22B Instruct 2507 FP8", + "display_name": "Qwen3 235B A22B Instruct 2507 FP8", "modalities": { "input": [ "text" @@ -101139,20 +103414,19 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -101160,7 +103434,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 130000 }, "temperature": true, "tool_call": true, @@ -101179,30 +103453,27 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-02-16", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "Qwen/Qwen3.6-Plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -101213,8 +103484,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", "interleaved": true, "summaries": true, "visibility": "summary", @@ -101223,17 +103492,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "kimi-k2-0711-preview", - "name": "Kimi K2 0711", - "display_name": "Kimi K2 0711", + "id": "Qwen/Qwen2.5-7B-Instruct-Turbo", + "name": "Qwen 2.5 7B Instruct Turbo", + "display_name": "Qwen 2.5 7B Instruct Turbo", "modalities": { "input": [ "text" @@ -101243,8 +103511,8 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -101253,15 +103521,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-07-14", - "last_updated": "2025-07-14", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "kimi-k2-thinking-turbo", - "name": "Kimi K2 Thinking Turbo", - "display_name": "Kimi K2 Thinking Turbo", + "id": "LiquidAI/LFM2-24B-A2B", + "name": "LFM2-24B-A2B", + "display_name": "LFM2-24B-A2B", "modalities": { "input": [ "text" @@ -101271,8 +103538,35 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-25", + "last_updated": "2026-02-25", + "type": "chat" + }, + { + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -101293,30 +103587,27 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -101324,122 +103615,81 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" - } - ] - }, - "model-oracle-ai": { - "id": "model-oracle-ai", - "name": "Model Oracle AI", - "display_name": "Model Oracle AI", - "api": "https://api.modeloracle.com/api/v1", - "doc": "https://modeloracle.com/setup/", - "models": [ + }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 524288, + "output": 250000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -101450,7 +103700,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -101471,30 +103721,29 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 163839, + "output": 163839 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -101502,84 +103751,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "deepseek-ai/DeepSeek-V3-1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-08", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "deepseek-v4-pro", + "id": "deepseek-ai/DeepSeek-V4-Pro", "name": "DeepSeek V4 Pro", "display_name": "DeepSeek V4 Pro", "modalities": { @@ -101591,7 +103808,7 @@ ] }, "limit": { - "context": 1000000, + "context": 512000, "output": 384000 }, "temperature": true, @@ -101613,68 +103830,50 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", "release_date": "2026-04-24", "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 131000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -101685,165 +103884,122 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2026-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-14", + "last_updated": "2026-06-14", "type": "chat" }, { - "id": "claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "auto", - "name": "Auto", - "display_name": "Auto", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -101856,139 +104012,114 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-29", - "last_updated": "2026-07-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2025-08", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "meta-llama/Meta-Llama-3-8B-Instruct-Lite", + "name": "Meta Llama 3 8B Instruct Lite", + "display_name": "Meta Llama 3 8B Instruct Lite", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "release_date": "2024-04-18", + "last_updated": "2024-04-18", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2026-07-02", "type": "chat" - }, + } + ] + }, + "digitalocean": { + "id": "digitalocean", + "name": "DigitalOcean", + "display_name": "DigitalOcean", + "api": "https://inference.do-ai.run/v1", + "doc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "models": [ { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "anthropic-claude-opus-4.8", + "name": "Anthropic Claude Opus 4.8", + "display_name": "Anthropic Claude Opus 4.8", "modalities": { "input": [ "text", @@ -101999,98 +104130,90 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-05-28", + "last_updated": "2026-05-29", "type": "chat" - } - ] - }, - "drun": { - "id": "drun", - "name": "D.Run (China)", - "display_name": "D.Run (China)", - "api": "https://chat.d.run/v1", - "doc": "https://www.d.run", - "models": [ + }, { - "id": "public/minimax-m25", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "openai-gpt-image-1", + "name": "GPT Image 1", + "display_name": "GPT Image 1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "release_date": "2025-04-24", + "last_updated": "2025-04-24", "type": "chat" }, { - "id": "public/deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "anthropic-claude-3.5-sonnet", + "name": "Claude 3.5 Sonnet", + "display_name": "Claude 3.5 Sonnet", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 200000, "output": 8192 }, "temperature": true, @@ -102098,66 +104221,47 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-06-20", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "public/deepseek-r1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "openai-gpt-5.6-terra", + "name": "OpenAI GPT-5.6 Terra", + "display_name": "OpenAI GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "lmstudio": { - "id": "lmstudio", - "name": "LMStudio", - "display_name": "LMStudio", - "api": "http://127.0.0.1:1234/v1", - "doc": "https://lmstudio.ai/models", - "models": [ + }, { - "id": "qwen/qwen3-coder-30b", - "name": "Qwen3 Coder 30B", - "display_name": "Qwen3 Coder 30B", + "id": "glm-5", + "name": "GLM 5", + "display_name": "GLM 5", "modalities": { "input": [ "text" @@ -102167,53 +104271,65 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 64000, + "output": 12800 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "release_date": "2026-02-11", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-2507", - "name": "Qwen3 30B A3B 2507", - "display_name": "Qwen3 30B A3B 2507", + "id": "openai-gpt-4.1", + "name": "OpenAI GPT-4.1", + "display_name": "OpenAI GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "gte-large-en-v1.5", + "name": "GTE Large (v1.5)", + "display_name": "GTE Large (v1.5)", "modalities": { "input": [ "text" @@ -102223,78 +104339,54 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2024-03-27", + "last_updated": "2026-04-16", "type": "chat" - } - ] - }, - "ovhcloud": { - "id": "ovhcloud", - "name": "OVHcloud AI Endpoints", - "display_name": "OVHcloud AI Endpoints", - "api": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", - "doc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", - "models": [ + }, { - "id": "qwen3-32b", - "name": "Qwen3-32B", - "display_name": "Qwen3-32B", + "id": "anthropic-claude-opus-5", + "name": "Anthropic Claude Opus 5", + "display_name": "Anthropic Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-16", - "last_updated": "2025-07-16", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder-30B-A3B-Instruct", - "display_name": "Qwen3-Coder-30B-A3B-Instruct", + "id": "mistral-3-14B", + "name": "Ministral 3 14B", + "display_name": "Ministral 3 14B", "modalities": { "input": [ "text" @@ -102305,7 +104397,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -102314,73 +104406,72 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "release_date": "2025-12-15", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "openai-gpt-5.4-pro", + "name": "OpenAI GPT-5.4 Pro", + "display_name": "OpenAI GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "mistral-nemo-instruct-2407", - "name": "Mistral-Nemo-Instruct-2407", - "display_name": "Mistral-Nemo-Instruct-2407", + "id": "ministral-3-8b-instruct-2512", + "name": "Ministral 3 8B", + "display_name": "Ministral 3 8B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "meta-llama-3_3-70b-instruct", - "name": "Meta-Llama-3_3-70B-Instruct", - "display_name": "Meta-Llama-3_3-70B-Instruct", + "id": "openai-gpt-oss-20b", + "name": "OpenAI GPT-oss-20b", + "display_name": "OpenAI GPT-oss-20b", "modalities": { "input": [ "text" @@ -102390,36 +104481,37 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-04-01", - "last_updated": "2025-04-01", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5-9B", - "display_name": "Qwen3.5-9B", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -102438,28 +104530,29 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6-27B", - "display_name": "Qwen3.6-27B", + "id": "nemotron-nano-12b-v2-vl", + "name": "Nemotron-nano 12b v2-vl", + "display_name": "Nemotron-nano 12b v2-vl", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -102469,52 +104562,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "qwen3guard-gen-8b", - "name": "Qwen3Guard-Gen-8B", - "display_name": "Qwen3Guard-Gen-8B", + "id": "anthropic-claude-4.5-sonnet", + "name": "Anthropic Claude 4.5 Sonnet", + "display_name": "Anthropic Claude 4.5 Sonnet", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "nvidia-nemotron-3-super-120b", + "name": "NVIDIA Nemotron 3 Super 120B (Public Preview)", + "display_name": "NVIDIA Nemotron 3 Super 120B (Public Preview)", "modalities": { "input": [ "text" @@ -102524,29 +104614,25 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "Mistral-Small-3.2-24B-Instruct-2506", - "display_name": "Mistral-Small-3.2-24B-Instruct-2506", + "id": "anthropic-claude-opus-4.5", + "name": "Anthropic Claude Opus 4.5", + "display_name": "Anthropic Claude Opus 4.5", "modalities": { "input": [ "text", @@ -102557,24 +104643,53 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-16", - "last_updated": "2025-07-16", + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5-397B-A17B", - "display_name": "Qwen3.5-397B-A17B", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -102586,9 +104701,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 52429 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -102607,14 +104722,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-05-18", - "last_updated": "2026-05-18", + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen3guard-gen-0.6b", - "name": "Qwen3Guard-Gen-0.6B", - "display_name": "Qwen3Guard-Gen-0.6B", + "id": "all-mini-lm-l6-v2", + "name": "All-MiniLM-L6-v2", + "display_name": "All-MiniLM-L6-v2", "modalities": { "input": [ "text" @@ -102624,24 +104740,24 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 256, + "output": 384 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "release_date": "2021-08-30", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "mistral-7b-instruct-v0.3", - "name": "Mistral-7B-Instruct-v0.3", - "display_name": "Mistral-7B-Instruct-v0.3", + "id": "mistral-nemo-instruct-2407", + "name": "Mistral Nemo Instruct", + "display_name": "Mistral Nemo Instruct", "modalities": { "input": [ "text" @@ -102651,8 +104767,8 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -102661,14 +104777,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-04-01", - "last_updated": "2025-04-01", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "qwen2.5-vl-72b-instruct", - "name": "Qwen2.5-VL-72B-Instruct", - "display_name": "Qwen2.5-VL-72B-Instruct", + "id": "openai-gpt-5.3-codex", + "name": "OpenAI GPT-5.3 Codex", + "display_name": "OpenAI GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -102679,33 +104795,26 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-31", - "last_updated": "2025-03-31", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" - } - ] - }, - "zeldoc": { - "id": "zeldoc", - "name": "Zeldoc", - "display_name": "Zeldoc", - "api": "https://api.zeldoc.ai/v1", - "doc": "https://docs.zeldoc.ai", - "models": [ + }, { - "id": "z-code", - "name": "Z-Code", - "display_name": "Z-Code", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -102715,8 +104824,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 52429 }, "temperature": true, "tool_call": true, @@ -102736,66 +104845,56 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-15", - "last_updated": "2026-04-15", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" - } - ] - }, - "auriko": { - "id": "auriko", - "name": "Auriko", - "display_name": "Auriko", - "api": "https://api.auriko.ai/v1", - "doc": "https://docs.auriko.ai", - "models": [ + }, { - "id": "minimax-m2-7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "openai-gpt-4o", + "name": "OpenAI GPT-4o", + "display_name": "OpenAI GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "anthropic-claude-haiku-4.5", + "name": "Anthropic Claude Haiku 4.5", + "display_name": "Anthropic Claude Haiku 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -102807,18 +104906,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -102826,88 +104918,36 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", - "modalities": { - "input": [ - "text" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 52429 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -102924,21 +104964,21 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "anthropic-claude-fable-5", + "name": "Anthropic Claude Fable 5", + "display_name": "Anthropic Claude Fable 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -102948,51 +104988,48 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2026-06-09", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen-2.5-14b-instruct", + "name": "Qwen 2.5 14B Instruct", + "display_name": "Qwen 2.5 14B Instruct", "modalities": { "input": [ "text" @@ -103002,52 +105039,38 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-09", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "display_name": "DeepSeek R1 Distill Llama 70B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32678, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -103055,72 +105078,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2025-01-30", + "last_updated": "2025-01-30", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "anthropic-claude-3-opus", + "name": "Claude 3 Opus", + "display_name": "Claude 3 Opus", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 200000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2023-08", + "release_date": "2024-02-29", + "last_updated": "2024-02-29", "type": "chat" }, { - "id": "minimax-m2-7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "nemotron-3-nano-omni", + "name": "Nemotron 3 Nano Omni", + "display_name": "Nemotron 3 Nano Omni", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 65536, + "output": 13107 }, "temperature": true, "tool_call": true, @@ -103128,58 +105140,43 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "stable-diffusion-3.5-large", + "name": "Stable Diffusion 3.5 Large", + "display_name": "Stable Diffusion 3.5 Large", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2024-10-22", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek-4-flash", + "name": "Deepseek V4 Flash", + "display_name": "Deepseek V4 Flash", "modalities": { "input": [ "text" @@ -103189,52 +105186,38 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2026-05-27", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "qwen-3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "openai-gpt-5.4", + "name": "OpenAI GPT-5.4", + "display_name": "OpenAI GPT-5.4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103242,30 +105225,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "anthropic-claude-4.1-opus", + "name": "Anthropic Claude 4.1 Opus", + "display_name": "Anthropic Claude 4.1 Opus", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -103273,49 +105253,56 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "anthropic-claude-3.5-haiku", + "name": "Claude 3.5 Haiku", + "display_name": "Claude 3.5 Haiku", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-07", + "release_date": "2024-11-05", + "last_updated": "2024-11-05", + "type": "chat" + }, + { + "id": "deepseek-v4-pro", + "name": "Deepseek V4 Pro", + "display_name": "Deepseek V4 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 52429 }, "temperature": true, "tool_call": true, @@ -103326,33 +105313,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "anthropic-claude-sonnet-4", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ "text", @@ -103365,9 +105344,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -103377,47 +105356,34 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" - } - ] - }, - "azure": { - "id": "azure", - "name": "Azure", - "display_name": "Azure", - "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", - "models": [ + }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex Mini", - "display_name": "GPT-5.1 Codex Mini", + "id": "openai-gpt-5-mini", + "name": "OpenAI GPT-5 Mini", + "display_name": "OpenAI GPT-5 Mini", "modalities": { "input": [ "text", @@ -103435,285 +105401,225 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", + "id": "openai-gpt-5.5", + "name": "OpenAI GPT-5.5", + "display_name": "OpenAI GPT-5.5", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "imageGeneration" + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-30", + "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 52429 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-chat-latest", - "name": "GPT Chat Latest", - "display_name": "GPT Chat Latest", + "id": "deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 163840, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-05-05", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "alibaba-qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 32768, + "output": 6554 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-30", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "openai-gpt-image-1.5", + "name": "OpenAI GPT Image 1.5", + "display_name": "OpenAI GPT Image 1.5", "modalities": { "input": [ "text", "image" ], "output": [ + "image", "text" ] }, "limit": { - "context": 128000, + "context": 8192, "output": 16384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "codex-mini", - "name": "Codex Mini", - "display_name": "Codex Mini", + "id": "llama-4-maverick", + "name": "Llama 4 Maverick", + "display_name": "Llama 4 Maverick", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-05-16", - "last_updated": "2025-05-16", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "phi-4-multimodal", - "name": "Phi-4-multimodal", - "display_name": "Phi-4-multimodal", + "id": "openai-gpt-5.2-pro", + "name": "OpenAI GPT-5.2 Pro", + "display_name": "OpenAI GPT-5.2 Pro", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "claude-haiku-4-5", + "id": "anthropic-claude-4.5-haiku", "name": "Claude Haiku 4.5", "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -103727,40 +105633,19 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, "knowledge": "2025-02-28", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "openai-gpt-5.4-mini", + "name": "OpenAI GPT-5.4 Mini", + "display_name": "OpenAI GPT-5.4 Mini", "modalities": { "input": [ "text", @@ -103771,7 +105656,7 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -103780,52 +105665,31 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "minimax-m2.5", + "name": "MiniMax M2.5 (Public Preview)", + "display_name": "MiniMax M2.5 (Public Preview)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 13107 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -103833,38 +105697,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-08", + "release_date": "2026-02-12", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "text-embedding-ada-002", - "name": "text-embedding-ada-002", - "display_name": "text-embedding-ada-002", + "id": "arcee-trinity-large-thinking", + "name": "Arcee Trinity Large Thinking (Public Preview)", + "display_name": "Arcee Trinity Large Thinking (Public Preview)", "modalities": { "input": [ "text" @@ -103874,94 +105720,36 @@ ] }, "limit": { - "context": 8192, - "output": 1536 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2022-12-15", - "last_updated": "2022-12-15", - "type": "embedding" - }, - { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-07-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "openai-gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -103970,83 +105758,47 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek-V4-Flash", - "display_name": "DeepSeek-V4-Flash", + "id": "openai-o1", + "name": "OpenAI o1", + "display_name": "OpenAI o1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai-gpt-5-nano", + "name": "OpenAI GPT-5 Nano", + "display_name": "OpenAI GPT-5 Nano", "modalities": { "input": [ "text", @@ -104057,50 +105809,38 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "anthropic-claude-opus-4.6", + "name": "Anthropic Claude Opus 4.6", + "display_name": "Anthropic Claude Opus 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -104112,39 +105852,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-31", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "anthropic-claude-4.6-sonnet", + "name": "Anthropic Claude Sonnet 4.6", + "display_name": "Anthropic Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -104155,25 +105897,26 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gpt-3.5-turbo-1106", - "name": "GPT-3.5 Turbo 1106", - "display_name": "GPT-3.5 Turbo 1106", + "id": "llama3.3-70b-instruct", + "name": "Llama 3.3 Instruct (70B)", + "display_name": "Llama 3.3 Instruct (70B)", "modalities": { "input": [ "text" @@ -104183,28 +105926,29 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-11-06", - "last_updated": "2023-11-06", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "deepseek-v3.2-speciale", - "name": "DeepSeek-V3.2-Speciale", - "display_name": "DeepSeek-V3.2-Speciale", + "id": "openai-gpt-4o-mini", + "name": "OpenAI GPT-4o mini", + "display_name": "OpenAI GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -104212,91 +105956,93 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "phi-4", - "name": "Phi-4", - "display_name": "Phi-4", + "id": "openai-gpt-image-2", + "name": "OpenAI GPT Image 2", + "display_name": "OpenAI GPT Image 2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ + "image", "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "attachment": true, + "open_weights": false, + "release_date": "2025-04-24", + "last_updated": "2025-04-24", "type": "chat" }, { - "id": "model-router", - "name": "Model Router", - "display_name": "Model Router", + "id": "wan2-2-t2v-a14b", + "name": "Wan2.2-T2V-A14B", + "display_name": "Wan2.2-T2V-A14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 100, + "output": 1 }, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-05-19", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "openai-gpt-5.6-sol", + "name": "OpenAI GPT-5.6 Sol", + "display_name": "OpenAI GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -104304,31 +106050,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -104339,10 +106071,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104351,20 +106083,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "ministral-3b", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ "text" @@ -104374,41 +106110,11 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 52429 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-03", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", - "type": "chat" - }, - { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, "reasoning": { "supported": true, "default": true @@ -104416,145 +106122,120 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "qwen3.5-397b-a17b", + "name": "Qwen 3.5 397B A17B", + "display_name": "Qwen 3.5 397B A17B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 131072, + "output": 26214 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "multi-qa-mpnet-base-dot-v1", + "name": "Multi-QA-mpnet-base-dot-v1", + "display_name": "Multi-QA-mpnet-base-dot-v1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 512, + "output": 768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "release_date": "2021-08-30", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", + "id": "qwen3-embedding-0.6b", + "name": "Qwen3 Embedding 0.6B", + "display_name": "Qwen3 Embedding 0.6B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 8000, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "type": "chat" + "release_date": "2025-06-03", + "last_updated": "2026-04-16", + "type": "embedding" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "openai-gpt-5.6-luna", + "name": "OpenAI GPT-5.6 Luna", + "display_name": "OpenAI GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -104565,7 +106246,7 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -104574,67 +106255,46 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "anthropic-claude-5-sonnet", + "name": "Anthropic Claude Sonnet 5", + "display_name": "Anthropic Claude Sonnet 5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "phi-4-reasoning", - "name": "Phi-4-reasoning", - "display_name": "Phi-4-reasoning", + "id": "nemotron-3-ultra-550b", + "name": "Nemotron 3 Ultra", + "display_name": "Nemotron 3 Ultra", "modalities": { "input": [ "text" @@ -104644,26 +106304,24 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 131072, + "output": 26214 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "release_date": "2026-06-04", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "openai-o3", + "name": "OpenAI o3", + "display_name": "OpenAI o3", "modalities": { "input": [ "text", @@ -104674,8 +106332,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -104683,38 +106341,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "llama3-8b-instruct", + "name": "Llama 3.1 Instruct (8B)", + "display_name": "Llama 3.1 Instruct (8B)", "modalities": { "input": [ "text" @@ -104724,8 +106361,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -104735,19 +106372,73 @@ "attachment": false, "open_weights": true, "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "bge-reranker-v2-m3", + "name": "BGE Reranker v2 M3", + "display_name": "BGE Reranker v2 M3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 1 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-03-12", + "last_updated": "2026-04-30", + "type": "rerank" + }, + { + "id": "nemotron-3-nano-30b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "anthropic-claude-3.7-sonnet", + "name": "Claude 3.7 Sonnet", + "display_name": "Claude 3.7 Sonnet", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -104772,73 +106463,83 @@ "min": 1024, "unit": "tokens" }, - "interleaved": true, - "summaries": true, - "visibility": "summary", + "interleaved": false, + "summaries": false, + "visibility": "full", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic uses thinking budget tokens" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2024-11", + "release_date": "2025-02-24", + "last_updated": "2025-02-24", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek-V4-Pro", - "display_name": "DeepSeek-V4-Pro", + "id": "anthropic-claude-opus-4", + "name": "Claude Opus 4", + "display_name": "Claude Opus 4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gpt-4-turbo-vision", - "name": "GPT-4 Turbo Vision", - "display_name": "GPT-4 Turbo Vision", + "id": "openai-gpt-oss-120b", + "name": "OpenAI GPT-oss-120b", + "display_name": "OpenAI GPT-oss-120b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -104851,32 +106552,43 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "anthropic-claude-opus-4.7", + "name": "Anthropic Claude Opus 4.7", + "display_name": "Anthropic Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -104889,34 +106601,38 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "openai-gpt-5", + "name": "OpenAI GPT-5", + "display_name": "OpenAI GPT-5", "modalities": { "input": [ "text", @@ -104927,237 +106643,171 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "phi-4-mini-reasoning", - "name": "Phi-4-mini-reasoning", - "display_name": "Phi-4-mini-reasoning", + "id": "gemma-4-31B-it", + "name": "Gemma 4", + "display_name": "Gemma 4", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-image-1.5", - "name": "GPT-Image-1.5", - "display_name": "GPT-Image-1.5", + "id": "openai-o3-mini", + "name": "OpenAI o3 mini", + "display_name": "OpenAI o3 mini", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 100000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25", - "type": "imageGeneration" + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", + "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "mistral-7b-instruct-v0.3", + "name": "Mistral 7B Instruct v0.3", + "display_name": "Mistral 7B Instruct v0.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "open_weights": true, + "release_date": "2024-05-22", + "last_updated": "2024-05-22", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "qwen3-tts-voicedesign", + "name": "Qwen3 TTS VoiceDesign", + "display_name": "Qwen3 TTS VoiceDesign", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 1 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-21", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "e5-large-v2", + "name": "E5 Large v2", + "display_name": "E5 Large v2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 512, + "output": 1024 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "attachment": false, + "open_weights": true, + "release_date": "2023-05-19", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "deepseek-3.2", + "name": "Deepseek 3.2", + "display_name": "Deepseek 3.2", "modalities": { "input": [ "text" @@ -105167,8 +106817,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -105178,53 +106828,57 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2024-12", + "release_date": "2025-12-02", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "cohere-embed-v-4-0", - "name": "Embed v4", - "display_name": "Embed v4", + "id": "bge-m3", + "name": "BGE M3", + "display_name": "BGE M3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 1536 + "context": 8192, + "output": 1024 }, "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "chat" + "release_date": "2024-01-30", + "last_updated": "2026-04-30", + "type": "embedding" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "openai-gpt-5.2", + "name": "OpenAI GPT-5.2", + "display_name": "OpenAI GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -105238,41 +106892,19 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "mistral-small-2503", - "name": "Mistral Small 3.1", - "display_name": "Mistral Small 3.1", + "id": "openai-gpt-5.4-nano", + "name": "OpenAI GPT-5.4 Nano", + "display_name": "OpenAI GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -105283,175 +106915,184 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "o1", - "name": "o1", - "display_name": "o1", + "id": "fal-ai/fast-sdxl", + "name": "Fast SDXL", + "display_name": "Fast SDXL", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": false, + "open_weights": true, + "release_date": "2023-07-26", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "fal-ai/stable-audio-25/text-to-audio", + "name": "Stable Audio 2.5 (Text-to-Audio)", + "display_name": "Stable Audio 2.5 (Text-to-Audio)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "release_date": "2025-10-08", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "fal-ai/flux/schnell", + "name": "FLUX.1 [schnell]", + "display_name": "FLUX.1 [schnell]", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": false, + "open_weights": true, + "release_date": "2024-08-01", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "fal-ai/elevenlabs/tts/multilingual-v2", + "name": "ElevenLabs Multilingual TTS v2", + "display_name": "ElevenLabs Multilingual TTS v2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] }, - "attachment": true, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2023-08-22", + "last_updated": "2026-04-16", "type": "chat" - }, + } + ] + }, + "moonshot": { + "id": "moonshot", + "name": "Moonshot AI (China)", + "display_name": "Moonshot AI (China)", + "api": "https://api.moonshot.cn/v1", + "doc": "https://platform.moonshot.cn/docs/api/chat", + "models": [ { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -105461,11 +107102,11 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -105483,29 +107124,30 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -105515,34 +107157,26 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "phi-4-reasoning-plus", - "name": "Phi-4-reasoning-plus", - "display_name": "Phi-4-reasoning-plus", + "id": "kimi-k2-0905-preview", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ "text" @@ -105552,160 +107186,139 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "kimi-k2-turbo-preview", + "name": "Kimi K2 Turbo", + "display_name": "Kimi K2 Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ - "text", - "image", - "audio" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "phi-4-mini", - "name": "Phi-4-mini", - "display_name": "Phi-4-mini", + "id": "kimi-k2-0711-preview", + "name": "Kimi K2 0711", + "display_name": "Kimi K2 0711", "modalities": { "input": [ "text" @@ -105715,8 +107328,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -105725,27 +107338,119 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2024-10", + "release_date": "2025-07-14", + "last_updated": "2025-07-14", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "display_name": "Kimi K2 Thinking Turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "type": "chat" + }, + { + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 262144 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", + "type": "chat" + } + ] + }, + "model-oracle-ai": { + "id": "model-oracle-ai", + "name": "Model Oracle AI", + "display_name": "Model Oracle AI", + "api": "https://api.modeloracle.com/api/v1", + "doc": "https://modeloracle.com/setup/", + "models": [ + { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -105754,79 +107459,123 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ - "text", - "image", - "audio" + "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -105842,10 +107591,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -105858,15 +107607,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -105877,8 +107626,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -105893,6 +107642,13 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -105902,15 +107658,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-3.5-turbo-instruct", - "name": "GPT-3.5 Turbo Instruct", - "display_name": "GPT-3.5 Turbo Instruct", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -105920,25 +107676,37 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-09-21", - "last_updated": "2023-09-21", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -105957,21 +107725,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -105984,58 +107751,81 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-image-1", - "name": "GPT-Image-1", - "display_name": "GPT-Image-1", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24", - "type": "imageGeneration" + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", + "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -106045,68 +107835,87 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high" + "high", + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gpt-3.5-turbo-0125", - "name": "GPT-3.5 Turbo 0125", - "display_name": "GPT-3.5 Turbo 0125", + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2021-08", - "release_date": "2024-01-25", - "last_updated": "2024-01-25", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "auto", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ "text", @@ -106121,7 +107930,7 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -106134,64 +107943,101 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-06-29", + "last_updated": "2026-07-07", "type": "chat" }, { - "id": "codestral-2501", - "name": "Codestral 25.01", - "display_name": "Codestral 25.01", + "id": "claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "cohere-embed-v3-multilingual", - "name": "Embed v3 Multilingual", - "display_name": "Embed v3 Multilingual", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 1024 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { @@ -106201,7 +108047,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -106266,11 +108113,20 @@ "release_date": "2025-04-16", "last_updated": "2025-04-16", "type": "chat" - }, + } + ] + }, + "drun": { + "id": "drun", + "name": "D.Run (China)", + "display_name": "D.Run (China)", + "api": "https://chat.d.run/v1", + "doc": "https://www.d.run", + "models": [ { - "id": "cohere-command-a", - "name": "Command A", - "display_name": "Command A", + "id": "public/minimax-m25", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ "text" @@ -106280,8 +108136,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -106289,17 +108145,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "open_weights": false, + "release_date": "2025-03-01", + "last_updated": "2025-03-01", "type": "chat" }, { - "id": "grok-4-20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "public/deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ "text" @@ -106309,46 +108175,38 @@ ] }, "limit": { - "context": 262000, + "context": 131072, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "public/deepseek-r1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -106356,71 +108214,63 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" - }, + } + ] + }, + "lmstudio": { + "id": "lmstudio", + "name": "LMStudio", + "display_name": "LMStudio", + "api": "http://127.0.0.1:1234/v1", + "doc": "https://lmstudio.ai/models", + "models": [ { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "qwen/qwen3-coder-30b", + "name": "Qwen3 Coder 30B", + "display_name": "Qwen3 Coder 30B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", + "id": "qwen/qwen3-30b-a3b-2507", + "name": "Qwen3 30B A3B 2507", + "display_name": "Qwen3 30B A3B 2507", "modalities": { "input": [ "text" @@ -106430,52 +108280,106 @@ ] }, "limit": { - "context": 8191, - "output": 3072 + "context": 262144, + "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "type": "chat" }, { - "id": "llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B 16E Instruct", - "display_name": "Llama 4 Scout 17B 16E Instruct", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + } + ] + }, + "ovhcloud": { + "id": "ovhcloud", + "name": "OVHcloud AI Endpoints", + "display_name": "OVHcloud AI Endpoints", + "api": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "doc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", + "models": [ + { + "id": "qwen3-32b", + "name": "Qwen3-32B", + "display_name": "Qwen3-32B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-16", + "last_updated": "2025-07-16", "type": "chat" }, { - "id": "cohere-embed-v3-english", - "name": "Embed v3 English", - "display_name": "Embed v3 English", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder-30B-A3B-Instruct", + "display_name": "Qwen3-Coder-30B-A3B-Instruct", "modalities": { "input": [ "text" @@ -106485,24 +108389,24 @@ ] }, "limit": { - "context": 512, - "output": 1024 + "context": 262144, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "grok-4-20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ "text" @@ -106512,13 +108416,13 @@ ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 131072, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -106526,16 +108430,15 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "open_weights": true, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "mistral-nemo-instruct-2407", + "name": "Mistral-Nemo-Instruct-2407", + "display_name": "Mistral-Nemo-Instruct-2407", "modalities": { "input": [ "text" @@ -106545,32 +108448,24 @@ ] }, "limit": { - "context": 8191, - "output": 1536 + "context": 65536, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - } - ] - }, - "kuae-cloud-coding-plan": { - "id": "kuae-cloud-coding-plan", - "name": "KUAE Cloud Coding Plan", - "display_name": "KUAE Cloud Coding Plan", - "api": "https://coding-plan-endpoint.kuaecloud.net/v1", - "doc": "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", - "models": [ + "open_weights": true, + "release_date": "2024-11-20", + "last_updated": "2024-11-20", + "type": "chat" + }, { - "id": "GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "meta-llama-3_3-70b-instruct", + "name": "Meta-Llama-3_3-70B-Instruct", + "display_name": "Meta-Llama-3_3-70B-Instruct", "modalities": { "input": [ "text" @@ -106580,58 +108475,35 @@ ] }, "limit": { - "context": 204800, + "context": 131072, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2025-04-01", + "last_updated": "2025-04-01", "type": "chat" - } - ] - }, - "modal": { - "id": "modal", - "name": "Modal", - "display_name": "Modal", - "api": "https://inference.us-west.modal.direct/v1", - "doc": "https://modal.com/docs/guide/endpoints", - "models": [ + }, { - "id": "thinkingmachines/Inkling-NVFP4", - "name": "Inkling", - "display_name": "Inkling", + "id": "qwen3.5-9b", + "name": "Qwen3.5-9B", + "display_name": "Qwen3.5-9B", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 262144 }, "temperature": true, @@ -106653,14 +108525,14 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen3.6-27b", + "name": "Qwen3.6-27B", + "display_name": "Qwen3.6-27B", "modalities": { "input": [ "text", @@ -106671,10 +108543,10 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -106693,40 +108565,53 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" - } - ] - }, - "qihang-ai": { - "id": "qihang-ai", - "name": "QiHang", - "display_name": "QiHang", - "api": "https://api.qhaigc.net/v1", - "doc": "https://www.qhaigc.net/docs", - "models": [ + }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "qwen3guard-gen-8b", + "name": "Qwen3Guard-Gen-8B", + "display_name": "Qwen3Guard-Gen-8B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 16384 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "type": "chat" + }, + { + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, "tool_call": true, "reasoning": { "supported": true, @@ -106734,190 +108619,141 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral-Small-3.2-24B-Instruct-2506", + "display_name": "Mistral-Small-3.2-24B-Instruct-2506", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2025-07-16", + "last_updated": "2025-07-16", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5-397B-A17B", + "display_name": "Qwen3.5-397B-A17B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-05-18", + "last_updated": "2026-05-18", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "qwen3guard-gen-0.6b", + "name": "Qwen3Guard-Gen-0.6B", + "display_name": "Qwen3Guard-Gen-0.6B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": false, + "open_weights": true, + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "type": "chat" + }, + { + "id": "mistral-7b-instruct-v0.3", + "name": "Mistral-7B-Instruct-v0.3", + "display_name": "Mistral-7B-Instruct-v0.3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "limit": { + "context": 65536, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-04-01", + "last_updated": "2025-04-01", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "qwen2.5-vl-72b-instruct", + "name": "Qwen2.5-VL-72B-Instruct", + "display_name": "Qwen2.5-VL-72B-Instruct", "modalities": { "input": [ "text", @@ -106928,160 +108764,175 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-03-31", + "last_updated": "2025-03-31", + "type": "chat" + } + ] + }, + "zeldoc": { + "id": "zeldoc", + "name": "Zeldoc", + "display_name": "Zeldoc", + "api": "https://api.zeldoc.ai/v1", + "doc": "https://docs.zeldoc.ai", + "models": [ + { + "id": "z-code", + "name": "Z-Code", + "display_name": "Z-Code", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "knowledge": "2025-01", + "release_date": "2026-04-15", + "last_updated": "2026-04-15", "type": "chat" - }, + } + ] + }, + "auriko": { + "id": "auriko", + "name": "Auriko", + "display_name": "Auriko", + "api": "https://api.auriko.ai/v1", + "doc": "https://docs.auriko.ai", + "models": [ { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "minimax-m2-7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5-Mini", - "display_name": "GPT-5-Mini", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -107089,61 +108940,57 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, "unit": "tokens" }, - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-10-01", - "last_updated": "2025-10-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -107154,77 +109001,83 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - } - ] - }, - "berget": { - "id": "berget", - "name": "Berget.AI", - "display_name": "Berget.AI", - "api": "https://api.berget.ai/v1", - "doc": "https://api.berget.ai", - "models": [ + }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B Instruct", - "display_name": "Gemma 4 31B Instruct", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "audio", - "image", "text", - "video" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -107234,8 +109087,8 @@ ] }, "limit": { - "context": 524288, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -107245,32 +109098,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -107287,29 +109149,30 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "mistralai/Mistral-Medium-3.5-128B", - "name": "Mistral Medium 3.5 128B", - "display_name": "Mistral Medium 3.5 128B", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -107317,17 +109180,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2026-04", - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", - "name": "Mistral Small 3.2 24B Instruct 2506", - "display_name": "Mistral Small 3.2 24B Instruct 2506", + "id": "minimax-m2-7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -107337,8 +109204,8 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -107348,13 +109215,12 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-10-01", - "last_updated": "2025-10-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", + "id": "kimi-k2.6", "name": "Kimi K2.6", "display_name": "Kimi K2.6", "modalities": { @@ -107391,28 +109257,27 @@ "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 327680, - "output": 32768 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -107429,27 +109294,30 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-27", - "last_updated": "2026-07-28", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS-120B", - "display_name": "GPT-OSS-120B", + "id": "qwen-3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -107457,33 +109325,32 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-08", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -107491,37 +109358,49 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-04-27", - "last_updated": "2025-04-27", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" - } - ] - }, - "moark": { - "id": "moark", - "name": "Moark", - "display_name": "Moark", - "api": "https://moark.com/v1", - "doc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", - "models": [ + }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -107531,104 +109410,182 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" } ] }, - "nova": { - "id": "nova", - "name": "Nova", - "display_name": "Nova", - "api": "https://api.nova.amazon.com/v1", - "doc": "https://nova.amazon.com/dev/documentation", + "azure": { + "id": "azure", + "name": "Azure", + "display_name": "Azure", + "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", "models": [ { - "id": "nova-2-lite-v1", - "name": "Nova 2 Lite", - "display_name": "Nova 2 Lite", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "display_name": "GPT-5.1 Codex Mini", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "nova-2-pro-v1", - "name": "Nova 2 Pro", - "display_name": "Nova 2 Pro", + "id": "gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "imageGeneration" + }, + { + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -107643,114 +109600,141 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2026-01-03", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" - } - ] - }, - "vultr": { - "id": "vultr", - "name": "Vultr", - "display_name": "Vultr", - "api": "https://api.vultrinference.com/v1", - "doc": "https://api.vultrinference.com/", - "models": [ + }, { - "id": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", - "name": "NVIDIA Nemotron 3 Nano Omni", - "display_name": "NVIDIA Nemotron 3 Nano Omni", + "id": "gpt-chat-latest", + "name": "GPT Chat Latest", + "display_name": "GPT Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-05-05", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "nvidia/DeepSeek-V3.2-NVFP4", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "nvidia/Nemotron-Cascade-2-30B-A3B", - "name": "NVIDIA Nemotron Cascade 2", - "display_name": "NVIDIA Nemotron Cascade 2", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "zai-org/GLM-5.2-FP8", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "codex-mini", + "name": "Codex Mini", + "display_name": "Codex Mini", "modalities": { "input": [ "text" @@ -107760,41 +109744,30 @@ ] }, "limit": { - "context": 393216, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-05-16", + "last_updated": "2025-05-16", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", - "modalities": { - "input": [ + "id": "phi-4-multimodal", + "name": "Phi-4-multimodal", + "display_name": "Phi-4-multimodal", + "modalities": { + "input": [ "text", "image", - "video", "audio" ], "output": [ @@ -107802,52 +109775,91 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", + "type": "chat" + }, + { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -107856,37 +109868,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -107895,24 +109919,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "display_name": "text-embedding-ada-002", "modalities": { "input": [ "text" @@ -107921,51 +109958,98 @@ "text" ] }, + "limit": { + "context": 8192, + "output": 1536 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "type": "embedding" + }, + { + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -107974,25 +110058,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.5-Pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "deepseek-v4-flash", + "name": "DeepSeek-V4-Flash", + "display_name": "DeepSeek-V4-Flash", "modalities": { "input": [ "text" @@ -108002,96 +110101,135 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "io-net": { - "id": "io-net", - "name": "IO.NET", - "display_name": "IO.NET", - "api": "https://api.intelligence.io.solutions/api/v1", - "doc": "https://io.net/docs/guides/intelligence/io-intelligence", - "models": [ + }, { - "id": "zai-org/GLM-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-11-15", - "last_updated": "2024-11-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-02-06", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "mistralai/Devstral-Small-2505", - "name": "Devstral Small 2505", - "display_name": "Devstral Small 2505", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-05-01", - "last_updated": "2025-05-01", + "knowledge": "2025-12-31", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "mistralai/Mistral-Large-Instruct-2411", - "name": "Mistral Large Instruct 2411", - "display_name": "Mistral Large Instruct 2411", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", @@ -108102,25 +110240,25 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "mistralai/Mistral-Nemo-Instruct-2407", - "name": "Mistral Nemo Instruct 2407", - "display_name": "Mistral Nemo Instruct 2407", + "id": "gpt-3.5-turbo-1106", + "name": "GPT-3.5 Turbo 1106", + "display_name": "GPT-3.5 Turbo 1106", "modalities": { "input": [ "text" @@ -108130,25 +110268,25 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-05", - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2023-11-06", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "mistralai/Magistral-Small-2506", - "name": "Magistral Small 2506", - "display_name": "Magistral Small 2506", + "id": "deepseek-v3.2-speciale", + "name": "DeepSeek-V3.2-Speciale", + "display_name": "DeepSeek-V3.2-Speciale", "modalities": { "input": [ "text" @@ -108159,81 +110297,80 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "Qwen/Qwen2.5-VL-32B-Instruct", - "name": "Qwen 2.5 VL 32B Instruct", - "display_name": "Qwen 2.5 VL 32B Instruct", + "id": "phi-4", + "name": "Phi-4", + "display_name": "Phi-4", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, + "context": 128000, "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen 3 Next 80B Instruct", - "display_name": "Qwen 3 Next 80B Instruct", + "id": "model-router", + "name": "Model Router", + "display_name": "Model Router", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 4096 + "context": 200000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-10", - "last_updated": "2025-01-10", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-19", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen 3 235B Thinking", - "display_name": "Qwen 3 235B Thinking", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -108243,10 +110380,10 @@ ] }, "limit": { - "context": 262144, - "output": 4096 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -108255,64 +110392,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-07-01", - "last_updated": "2025-07-01", - "type": "chat" - }, - { - "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", - "name": "Qwen 3 Coder 480B", - "display_name": "Qwen 3 Coder 480B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 106000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -108323,25 +110436,20 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-28", + "knowledge": "2025-01", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Instruct-0905", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "ministral-3b", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ "text" @@ -108351,8 +110459,8 @@ ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -108360,29 +110468,31 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-08", - "release_date": "2024-09-05", - "last_updated": "2024-09-05", + "open_weights": true, + "knowledge": "2024-03", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -108391,119 +110501,145 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-08", - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "knowledge": "2025-12-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT-OSS 20B", - "display_name": "GPT-OSS 20B", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 4096 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "meta-llama/Llama-3.2-90B-Vision-Instruct", - "name": "Llama 3.2 90B Vision Instruct", - "display_name": "Llama 3.2 90B Vision Instruct", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -108514,25 +110650,47 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - "name": "Llama 4 Maverick 17B 128E Instruct", - "display_name": "Llama 4 Maverick 17B 128E Instruct", + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -108543,34 +110701,25 @@ ] }, "limit": { - "context": 430000, - "output": 4096 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" - } - ] - }, - "neuralwatt": { - "id": "neuralwatt", - "name": "Neuralwatt", - "display_name": "Neuralwatt", - "api": "https://api.neuralwatt.com/v1", - "doc": "https://portal.neuralwatt.com/docs", - "models": [ + }, { - "id": "glm-5.2-short-fast", - "name": "GLM 5.2 Short Fast", - "display_name": "GLM 5.2 Short Fast", + "id": "phi-4-reasoning", + "name": "Phi-4-reasoning", + "display_name": "Phi-4-reasoning", "modalities": { "input": [ "text" @@ -108580,37 +110729,40 @@ ] }, "limit": { - "context": 199984, - "output": 199984 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -108619,25 +110771,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "glm-5.2-short", - "name": "GLM 5.2 Short", - "display_name": "GLM 5.2 Short", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -108647,58 +110809,77 @@ ] }, "limit": { - "context": 199984, - "output": 199984 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "glm-5.2-short-flex", - "name": "GLM 5.2 Short Flex", - "display_name": "GLM 5.2 Short Flex", + "id": "deepseek-v4-pro", + "name": "DeepSeek-V4-Pro", + "display_name": "DeepSeek-V4-Pro", "modalities": { "input": [ "text" @@ -108708,40 +110889,11 @@ ] }, "limit": { - "context": 199984, - "output": 199984 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", - "type": "chat" - }, - { - "id": "kimi-k2.6-flex", - "name": "Kimi K2.6 Flex", - "display_name": "Kimi K2.6 Flex", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262128, - "output": 262128 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -108757,16 +110909,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "kimi-k2.5-fast", - "name": "Kimi K2.5 Fast", - "display_name": "Kimi K2.5 Fast", + "id": "gpt-4-turbo-vision", + "name": "GPT-4 Turbo Vision", + "display_name": "GPT-4 Turbo Vision", "modalities": { "input": [ "text", @@ -108777,8 +110930,8 @@ ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -108786,92 +110939,103 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "qwen3.6-35b-fast", - "name": "Qwen3.6 35B Fast", - "display_name": "Qwen3.6 35B Fast", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131056, - "output": 131056 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3.5-397b-fast", - "name": "Qwen3.5 397B Fast", - "display_name": "Qwen3.5 397B Fast", + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "glm-5.2-fast", - "name": "GLM 5.2 Fast", - "display_name": "GLM 5.2 Fast", + "id": "phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "display_name": "Phi-4-mini-reasoning", "modalities": { "input": [ "text" @@ -108881,53 +111045,55 @@ ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "gemma-4-31b", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "gpt-image-1.5", + "name": "GPT-Image-1.5", + "display_name": "GPT-Image-1.5", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262128, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" + "open_weights": false, + "release_date": "2025-11-25", + "last_updated": "2025-11-25", + "type": "imageGeneration" }, { - "id": "kimi-k2.7-code-flex", - "name": "Kimi K2.7 Code Flex", - "display_name": "Kimi K2.7 Code Flex", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -108938,8 +111104,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -108947,73 +111113,136 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" }, { - "id": "kimi-k2.6-fast", - "name": "Kimi K2.6 Fast", - "display_name": "Kimi K2.6 Fast", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "glm-5.2-flex", - "name": "GLM 5.2 Flex", - "display_name": "GLM 5.2 Flex", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "glm-5.2-short-fast-flex", - "name": "GLM 5.2 Short Fast Flex", - "display_name": "GLM 5.2 Short Fast Flex", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ "text" @@ -109023,24 +111252,31 @@ ] }, "limit": { - "context": 199984, - "output": 199984 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-17", - "last_updated": "2026-06-17", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "cohere-embed-v-4-0", + "name": "Embed v4", + "display_name": "Embed v4", "modalities": { "input": [ "text", @@ -109051,75 +111287,77 @@ ] }, "limit": { - "context": 131056, - "output": 131056 + "context": 128000, + "output": 1536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B-FP8", - "name": "Qwen3.5 397B A17B FP8", - "display_name": "Qwen3.5 397B A17B FP8", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "mistral-small-2503", + "name": "Mistral Small 3.1", + "display_name": "Mistral Small 3.1", "modalities": { "input": [ "text", @@ -109130,36 +111368,25 @@ ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2024-09", + "release_date": "2025-03-01", + "last_updated": "2025-03-01", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", @@ -109170,10 +111397,10 @@ ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -109182,36 +111409,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": false, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -109221,29 +111453,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "aki-io": { - "id": "aki-io", - "name": "AKI.IO", - "display_name": "AKI.IO", - "api": "https://aki.io/v1", - "doc": "https://aki.io/docs/", - "models": [ + }, { - "id": "mistral4-119b", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -109254,54 +111495,48 @@ ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" - }, - { - "id": "minimax-m2.5-230b", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 196608, - "output": 65536 + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ "text" @@ -109311,30 +111546,37 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 163840, + "output": 163840 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "gemma4-26b", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -109345,55 +111587,76 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "kimi-k2.7-code-1100b", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "phi-4-reasoning-plus", + "name": "Phi-4-reasoning-plus", + "display_name": "Phi-4-reasoning-plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 32000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "qwen3.6-35b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -109404,10 +111667,10 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -109416,236 +111679,293 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "xai": { - "id": "xai", - "name": "xai", - "display_name": "xai", - "doc": "https://docs.x.ai/docs/models", - "models": [ + }, { - "id": "grok-imagine-video", - "name": "Grok Imagine Video", - "display_name": "Grok Imagine Video", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio" ], "output": [ - "video" + "text", + "image", + "audio" ] }, "limit": { - "context": 1024, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "phi-4-mini", + "name": "Phi-4-mini", + "display_name": "Phi-4-mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "grok-imagine-video-1.5", - "name": "Grok Imagine Video 1.5", - "display_name": "Grok Imagine Video 1.5", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ "text", - "image", - "audio", - "pdf" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 1024, + "context": 128000, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-05-30", - "last_updated": "2026-05-30", + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "grok-4.20-multi-agent-0309", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ - "text" + "text", + "image", + "audio" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "grok-imagine-image-quality", - "name": "Grok Imagine Image Quality", - "display_name": "Grok Imagine Image Quality", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "image", - "pdf" + "text" ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-03", - "last_updated": "2026-04-03", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -109653,54 +111973,57 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "display_name": "GPT-3.5 Turbo Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2021-08", + "release_date": "2023-09-21", + "last_updated": "2023-09-21", "type": "chat" }, { - "id": "grok-4.20-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -109712,38 +112035,60 @@ ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "grok-imagine-image", - "name": "Grok Imagine Image", - "display_name": "Grok Imagine Image", + "id": "gpt-image-1", + "name": "GPT-Image-1", + "display_name": "GPT-Image-1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "image", - "pdf" + "image" ] }, "limit": { - "context": 8000, + "context": 8192, "output": 8192 }, "temperature": false, @@ -109753,43 +112098,72 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28", - "type": "chat" + "release_date": "2025-04-24", + "last_updated": "2025-04-24", + "type": "imageGeneration" }, { - "id": "grok-3-mini-fast-beta", - "name": "Grok 3 Mini Fast Beta", - "display_name": "Grok 3 Mini Fast Beta", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "effort": "low" - }, - "search": { - "supported": false + "default": false }, - "attachment": false, - "type": "chat" + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", + "type": "chat" }, { - "id": "grok-3-mini-beta", - "name": "Grok 3 Mini Beta", - "display_name": "Grok 3 Mini Beta", + "id": "gpt-3.5-turbo-0125", + "name": "GPT-3.5 Turbo 0125", + "display_name": "GPT-3.5 Turbo 0125", "modalities": { "input": [ "text" @@ -109799,26 +112173,61 @@ ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 16384, + "output": 16384 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "chat" + }, + { + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "effort": "low" + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "grok-3-fast-beta", - "name": "Grok 3 Fast Beta", - "display_name": "Grok 3 Fast Beta", + "id": "codestral-2501", + "name": "Codestral 25.01", + "display_name": "Codestral 25.01", "modalities": { "input": [ "text" @@ -109828,24 +112237,52 @@ ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { + "attachment": false, + "open_weights": false, + "knowledge": "2024-03", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "type": "chat" + }, + { + "id": "cohere-embed-v3-multilingual", + "name": "Embed v3 Multilingual", + "display_name": "Embed v3 Multilingual", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 1024 + }, + "temperature": false, + "tool_call": false, + "reasoning": { "supported": false }, "attachment": false, + "open_weights": true, + "release_date": "2023-11-07", + "last_updated": "2023-11-07", "type": "chat" }, { - "id": "grok-2-vision-1212", - "name": "Grok 2 Vision 1212", - "display_name": "Grok 2 Vision 1212", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -109856,24 +112293,25 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": false - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "grok-2-image-1212", - "name": "Grok 2 Image 1212", - "display_name": "Grok 2 Image 1212", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", @@ -109884,24 +112322,40 @@ ] }, "limit": { - "context": 130000, + "context": 200000, "output": 100000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "grok-3-beta", - "name": "Grok 3 Beta", - "display_name": "Grok 3 Beta", + "id": "cohere-command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ "text" @@ -109911,24 +112365,26 @@ ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "search": { - "supported": false + "supported": true, + "default": true }, "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "grok-2-1212", - "name": "Grok 2 1212", - "display_name": "Grok 2 1212", + "id": "grok-4-20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text" @@ -109938,47 +112394,46 @@ ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 262000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" - } - ] - }, - "hetzner": { - "id": "hetzner", - "name": "Hetzner", - "display_name": "Hetzner", - "api": "https://inference.hetzner.com/api/v1", - "doc": "https://experiments.hetzner.com/docs/inference", - "models": [ + }, { - "id": "Qwen/Qwen3.6-35B-A3B-FP8", - "name": "Qwen3.6 35B A3B FP8", - "display_name": "Qwen3.6 35B A3B FP8", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -109986,82 +112441,71 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" - } - ] - }, - "zenifra": { - "id": "zenifra", - "name": "Zenifra", - "display_name": "Zenifra", - "api": "https://ai.zenifra.com/v1", - "doc": "https://docs.zenifra.com", - "models": [ + }, { - "id": "alibaba/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" - } - ] - }, - "morph": { - "id": "morph", - "name": "Morph", - "display_name": "Morph", - "api": "https://api.morphllm.com/v1", - "doc": "https://docs.morphllm.com/api-reference/introduction", - "models": [ + }, { - "id": "morph-v3-large", - "name": "Morph v3 Large", - "display_name": "Morph v3 Large", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", "modalities": { "input": [ "text" @@ -110071,24 +112515,52 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 8191, + "output": 3072 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-08-15", - "last_updated": "2024-08-15", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" + }, + { + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "display_name": "Llama 4 Scout 17B 16E Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "auto", - "name": "Auto", - "display_name": "Auto", + "id": "cohere-embed-v3-english", + "name": "Embed v3 English", + "display_name": "Embed v3 English", "modalities": { "input": [ "text" @@ -110098,11 +112570,38 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 512, + "output": 1024 }, "temperature": false, "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2023-11-07", + "last_updated": "2023-11-07", + "type": "chat" + }, + { + "id": "grok-4-20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true }, @@ -110113,14 +112612,15 @@ }, "attachment": false, "open_weights": false, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "knowledge": "2025-09", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "morph-v3-fast", - "name": "Morph v3 Fast", - "display_name": "Morph v3 Fast", + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ "text" @@ -110130,47 +112630,45 @@ ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 8191, + "output": 1536 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-08-15", - "last_updated": "2024-08-15", - "type": "chat" + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" } ] }, - "umans-ai-coding-plan": { - "id": "umans-ai-coding-plan", - "name": "Umans AI Coding Plan", - "display_name": "Umans AI Coding Plan", - "api": "https://api.code.umans.ai/v1", - "doc": "https://app.umans.ai/offers/code/docs", + "kuae-cloud-coding-plan": { + "id": "kuae-cloud-coding-plan", + "name": "KUAE Cloud Coding Plan", + "display_name": "KUAE Cloud Coding Plan", + "api": "https://coding-plan-endpoint.kuaecloud.net/v1", + "doc": "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", "models": [ { - "id": "umans-flash", - "name": "Umans Flash", - "display_name": "Umans Flash", + "id": "GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110187,30 +112685,41 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - }, + } + ] + }, + "modal": { + "id": "modal", + "name": "Modal", + "display_name": "Modal", + "api": "https://inference.us-west.modal.direct/v1", + "doc": "https://modal.com/docs/guide/endpoints", + "models": [ { - "id": "umans-coder", - "name": "Umans Coder", - "display_name": "Umans Coder", + "id": "thinkingmachines/Inkling-NVFP4", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110229,15 +112738,14 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "umans-glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -110248,10 +112756,10 @@ ] }, "limit": { - "context": 405504, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -110268,31 +112776,42 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "qihang-ai": { + "id": "qihang-ai", + "name": "QiHang", + "display_name": "QiHang", + "api": "https://api.qhaigc.net/v1", + "doc": "https://www.qhaigc.net/docs", + "models": [ { - "id": "umans-kimi-k2.7", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110301,39 +112820,51 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "umans-qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110342,72 +112873,85 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "umans-glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" - } - ] - }, - "mistral": { - "id": "mistral", - "name": "Mistral", - "display_name": "Mistral", - "doc": "https://docs.mistral.ai/getting-started/models/", - "models": [ + }, { - "id": "mistral-small-2506", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -110418,25 +112962,47 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "pixtral-large-latest", - "name": "Pixtral Large (latest)", - "display_name": "Pixtral Large (latest)", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -110447,25 +113013,53 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2024-11-04", + "open_weights": false, + "knowledge": "2025-03", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "pixtral-12b", - "name": "Pixtral 12B", - "display_name": "Pixtral 12B", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -110476,93 +113070,165 @@ ] }, "limit": { - "context": 128000, + "context": 400000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-09-01", - "last_updated": "2024-09-01", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "open-mixtral-8x7b", - "name": "Mixtral 8x7B", - "display_name": "Mixtral 8x7B", + "id": "gpt-5-mini", + "name": "GPT-5-Mini", + "display_name": "GPT-5-Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-01", - "release_date": "2023-12-11", - "last_updated": "2023-12-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "labs-devstral-small-2512", - "name": "Devstral Small 2", - "display_name": "Devstral Small 2", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", "type": "chat" }, { - "id": "magistral-medium-latest", - "name": "Magistral Medium (latest)", - "display_name": "Magistral Medium (latest)", + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -110570,46 +113236,80 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" - }, + } + ] + }, + "berget": { + "id": "berget", + "name": "Berget.AI", + "display_name": "Berget.AI", + "api": "https://api.berget.ai/v1", + "doc": "https://api.berget.ai", + "models": [ { - "id": "mistral-medium-2508", - "name": "Mistral Medium 3.1", - "display_name": "Mistral Medium 3.1", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B Instruct", + "display_name": "Gemma 4 31B Instruct", "modalities": { "input": [ + "audio", + "image", "text", - "image" + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-08-12", - "last_updated": "2025-08-12", + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "mistral-large-2411", - "name": "Mistral Large 2.1", - "display_name": "Mistral Large 2.1", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -110619,37 +113319,41 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 524288, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-18", - "last_updated": "2024-11-18", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "zai-org/GLM-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -110657,18 +113361,31 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "knowledge": "2025-12", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "devstral-small-2507", - "name": "Devstral Small", - "display_name": "Devstral Small", + "id": "mistralai/Mistral-Medium-3.5-128B", + "name": "Mistral Medium 3.5 128B", + "display_name": "Mistral Medium 3.5 128B", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -110676,25 +113393,26 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, + "supported": true, + "default": true + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-07-10", - "last_updated": "2025-07-10", + "knowledge": "2026-04", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "open-mistral-7b", - "name": "Mistral 7B", - "display_name": "Mistral 7B", + "id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "name": "Mistral Small 3.2 24B Instruct 2506", + "display_name": "Mistral Small 3.2 24B Instruct 2506", "modalities": { "input": [ "text" @@ -110704,54 +113422,108 @@ ] }, "limit": { - "context": 8000, - "output": 8000 + "context": 32000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2023-09-27", - "last_updated": "2023-09-27", + "knowledge": "2025-09", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", "type": "chat" }, { - "id": "mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "ministral-3b-latest", - "name": "Ministral 3B (latest)", - "display_name": "Ministral 3B (latest)", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 327680, + "output": 32768 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-27", + "last_updated": "2026-07-28", + "type": "chat" + }, + { + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS-120B", + "display_name": "GPT-OSS-120B", "modalities": { "input": [ "text" @@ -110762,36 +113534,41 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-10-01", - "last_updated": "2024-10-04", + "knowledge": "2025-08", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mistral-small-latest", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -110799,17 +113576,26 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2023-12", + "release_date": "2025-04-27", + "last_updated": "2025-04-27", "type": "chat" - }, + } + ] + }, + "moark": { + "id": "moark", + "name": "Moark", + "display_name": "Moark", + "api": "https://moark.com/v1", + "doc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", + "models": [ { - "id": "open-mixtral-8x22b", - "name": "Mixtral 8x22B", - "display_name": "Mixtral 8x22B", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -110819,25 +113605,30 @@ ] }, "limit": { - "context": 64000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -110847,37 +113638,60 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - }, + } + ] + }, + "nova": { + "id": "nova", + "name": "Nova", + "display_name": "Nova", + "api": "https://api.nova.amazon.com/v1", + "doc": "https://nova.amazon.com/dev/documentation", + "models": [ { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "nova-2-lite-v1", + "name": "Nova 2 Lite", + "display_name": "Nova 2 Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -110886,28 +113700,29 @@ "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "mistral-medium-2604", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "nova-2-pro-v1", + "name": "Nova 2 Pro", + "display_name": "Nova 2 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -110916,15 +113731,24 @@ "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2026-01-03", "type": "chat" - }, + } + ] + }, + "vultr": { + "id": "vultr", + "name": "Vultr", + "display_name": "Vultr", + "api": "https://api.vultrinference.com/v1", + "doc": "https://api.vultrinference.com/", + "models": [ { - "id": "devstral-latest", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", + "name": "NVIDIA Nemotron 3 Nano Omni", + "display_name": "NVIDIA Nemotron 3 Nano Omni", "modalities": { "input": [ "text" @@ -110935,24 +113759,25 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "knowledge": "2025-05", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "ministral-8b-latest", - "name": "Ministral 8B (latest)", - "display_name": "Ministral 8B (latest)", + "id": "nvidia/DeepSeek-V3.2-NVFP4", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -110962,25 +113787,26 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-10-01", - "last_updated": "2024-10-04", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "mistral-embed", - "name": "Mistral Embed", - "display_name": "Mistral Embed", + "id": "nvidia/Nemotron-Cascade-2-30B-A3B", + "name": "NVIDIA Nemotron Cascade 2", + "display_name": "NVIDIA Nemotron Cascade 2", "modalities": { "input": [ "text" @@ -110990,24 +113816,26 @@ ] }, "limit": { - "context": 8000, - "output": 3072 + "context": 262144, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "codestral-latest", - "name": "Codestral (latest)", - "display_name": "Codestral (latest)", + "id": "zai-org/GLM-5.2-FP8", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -111017,28 +113845,42 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 393216, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-05-29", - "last_updated": "2025-01-04", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "devstral-medium-latest", - "name": "Devstral 2 (latest)", - "display_name": "Devstral 2 (latest)", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -111046,27 +113888,41 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -111074,53 +113930,74 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "devstral-medium-2507", - "name": "Devstral Medium", - "display_name": "Devstral Medium", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -111130,25 +114007,37 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2025-07-10", - "last_updated": "2025-07-10", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "devstral-small-2505", - "name": "Devstral Small 2505", - "display_name": "Devstral Small 2505", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text" @@ -111158,25 +114047,37 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "magistral-small", - "name": "Magistral Small", - "display_name": "Magistral Small", + "id": "XiaomiMiMo/MiMo-V2.5-Pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ "text" @@ -111186,8 +114087,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -111197,15 +114098,57 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + } + ] + }, + "io-net": { + "id": "io-net", + "name": "IO.NET", + "display_name": "IO.NET", + "api": "https://api.intelligence.io.solutions/api/v1", + "doc": "https://io.net/docs/guides/intelligence/io-intelligence", + "models": [ + { + "id": "zai-org/GLM-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-11-15", + "last_updated": "2024-11-15", "type": "chat" }, { - "id": "open-mistral-nemo", - "name": "Open Mistral Nemo", - "display_name": "Open Mistral Nemo", + "id": "mistralai/Devstral-Small-2505", + "name": "Devstral Small 2505", + "display_name": "Devstral Small 2505", "modalities": { "input": [ "text" @@ -111216,7 +114159,7 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 4096 }, "temperature": true, "tool_call": true, @@ -111224,16 +114167,16 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", "type": "chat" }, { - "id": "mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "mistralai/Mistral-Large-Instruct-2411", + "name": "Mistral Large Instruct 2411", + "display_name": "Mistral Large Instruct 2411", "modalities": { "input": [ "text", @@ -111244,115 +114187,81 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-11", + "attachment": false, + "open_weights": false, + "knowledge": "2024-10", "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "last_updated": "2024-11-01", "type": "chat" - } - ] - }, - "umans-ai": { - "id": "umans-ai", - "name": "Umans AI", - "display_name": "Umans AI", - "api": "https://api.code.umans.ai/v1", - "doc": "https://app.umans.ai/offers/code/docs/orgs", - "models": [ + }, { - "id": "umans-flash", - "name": "Umans Flash", - "display_name": "Umans Flash", + "id": "mistralai/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo Instruct 2407", + "display_name": "Mistral Nemo Instruct 2407", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-05", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "umans-coder", - "name": "Umans Coder", - "display_name": "Umans Coder", + "id": "mistralai/Magistral-Small-2506", + "name": "Magistral Small 2506", + "display_name": "Magistral Small 2506", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, + "attachment": false, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "umans-glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen 2.5 VL 32B Instruct", + "display_name": "Qwen 2.5 VL 32B Instruct", "modalities": { "input": [ "text", @@ -111363,41 +114272,28 @@ ] }, "limit": { - "context": 405504, - "output": 131072 + "context": 32000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-09", + "release_date": "2024-11-01", + "last_updated": "2024-11-01", "type": "chat" }, { - "id": "umans-kimi-k2.7", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen 3 Next 80B Instruct", + "display_name": "Qwen 3 Next 80B Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -111405,48 +114301,35 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2024-12", + "release_date": "2025-01-10", + "last_updated": "2025-01-10", "type": "chat" }, { - "id": "umans-glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen 3 235B Thinking", + "display_name": "Qwen 3 235B Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -111467,73 +114350,43 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-12", + "release_date": "2025-07-01", + "last_updated": "2025-07-01", "type": "chat" - } - ] - }, - "ofox": { - "id": "ofox", - "name": "Ofox", - "display_name": "Ofox", - "api": "https://api.ofox.ai/v1", - "doc": "https://ofox.ai/docs", - "models": [ + }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", + "name": "Qwen 3 Coder 480B", + "display_name": "Qwen 3 Coder 480B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 106000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ "text" @@ -111543,8 +114396,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -111565,65 +114418,56 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 Instruct", + "display_name": "Kimi K2 Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 32768, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-08", + "release_date": "2024-09-05", + "last_updated": "2024-09-05", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -111632,133 +114476,91 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-08", + "release_date": "2024-11-01", + "last_updated": "2024-11-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-oss-20b", + "name": "GPT-OSS 20B", + "display_name": "GPT-OSS 20B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 64000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -111768,187 +114570,132 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "meta-llama/Llama-3.2-90B-Vision-Instruct", + "name": "Llama 3.2 90B Vision Instruct", + "display_name": "Llama 3.2 90B Vision Instruct", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick 17B 128E Instruct", + "display_name": "Llama 4 Maverick 17B 128E Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 430000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" - }, + } + ] + }, + "neuralwatt": { + "id": "neuralwatt", + "name": "Neuralwatt", + "display_name": "Neuralwatt", + "api": "https://api.neuralwatt.com/v1", + "doc": "https://portal.neuralwatt.com/docs", + "models": [ { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "glm-5.2-short-fast", + "name": "GLM 5.2 Short Fast", + "display_name": "GLM 5.2 Short Fast", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 199984, + "output": 199984 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048560, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -111957,91 +114704,53 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "glm-5.2-short", + "name": "GLM 5.2 Short", + "display_name": "GLM 5.2 Short", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 199984, + "output": 199984 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "bailian/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -112051,8 +114760,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, @@ -112066,39 +114775,26 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" - } - ] - }, - "orcarouter": { - "id": "orcarouter", - "name": "OrcaRouter", - "display_name": "OrcaRouter", - "api": "https://api.orcarouter.ai/v1", - "doc": "https://docs.orcarouter.ai", - "models": [ + }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "glm-5.2-short-flex", + "name": "GLM 5.2 Short Flex", + "display_name": "GLM 5.2 Short Flex", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 199984, + "output": 199984 }, "temperature": true, "tool_call": true, @@ -112106,32 +114802,28 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "kimi-k2.6-flex", + "name": "Kimi K2.6 Flex", + "display_name": "Kimi K2.6 Flex", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, @@ -112142,208 +114834,156 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "kimi-k2.5-fast", + "name": "Kimi K2.5 Fast", + "display_name": "Kimi K2.5 Fast", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "open_weights": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "qwen3.6-35b-fast", + "name": "Qwen3.6 35B Fast", + "display_name": "Qwen3.6 35B Fast", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131056, + "output": 131056 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "qwen3.5-397b-fast", + "name": "Qwen3.5 397B Fast", + "display_name": "Qwen3.5 397B Fast", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "glm-5.2-fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "gemma-4-31b", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", @@ -112354,8 +114994,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 262128, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -112363,11 +115003,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": true, "release_date": "2026-04-02", @@ -112375,109 +115010,81 @@ "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "kimi-k2.7-code-flex", + "name": "Kimi K2.7 Code Flex", + "display_name": "Kimi K2.7 Code Flex", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "kimi-k2.6-fast", + "name": "Kimi K2.6 Fast", + "display_name": "Kimi K2.6 Fast", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1048560, + "output": 1048560 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -112486,48 +115093,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/gemini-3-pro-preview", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "glm-5.2-flex", + "name": "GLM 5.2 Flex", + "display_name": "GLM 5.2 Flex", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, @@ -112535,100 +115129,55 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "glm-5.2-short-fast-flex", + "name": "GLM 5.2 Short Fast Flex", + "display_name": "GLM 5.2 Short Fast Flex", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 199984, + "output": 199984 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131056, + "output": 131056 }, "temperature": true, "tool_call": true, @@ -112649,27 +115198,25 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "Qwen/Qwen3.5-397B-A17B-FP8", + "name": "Qwen3.5 397B A17B FP8", + "display_name": "Qwen3.5 397B A17B FP8", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, @@ -112689,30 +115236,27 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, @@ -112733,28 +115277,26 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 262128, + "output": 262128 }, "temperature": true, "tool_call": true, @@ -112775,17 +115317,18 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -112793,41 +115336,43 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" - }, + } + ] + }, + "aki-io": { + "id": "aki-io", + "name": "AKI.IO", + "display_name": "AKI.IO", + "api": "https://aki.io/v1", + "doc": "https://aki.io/docs/", + "models": [ { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "mistral4-119b", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -112835,7 +115380,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 81920 }, "temperature": true, "tool_call": true, @@ -112843,39 +115388,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "minimax-m2.5-230b", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 196608, "output": 65536 }, "temperature": true, @@ -112884,42 +115417,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -112929,25 +115447,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "orcarouter/auto", - "name": "OrcaRouter Auto", - "display_name": "OrcaRouter Auto", + "id": "gemma4-26b", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", @@ -112958,75 +115470,67 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2026-05-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "grok/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "kimi-k2.7-code-1100b", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 262144, + "output": 81920 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "qwen3.6-35b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -113047,64 +115551,65 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "xai": { + "id": "xai", + "name": "xai", + "display_name": "xai", + "doc": "https://docs.x.ai/docs/models", + "models": [ { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "grok-imagine-video", + "name": "Grok Imagine Video", + "display_name": "Grok Imagine Video", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1024, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "release_date": "2026-01-28", + "last_updated": "2026-01-28", "type": "chat" }, { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -113117,92 +115622,80 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "grok-imagine-video-1.5", + "name": "Grok Imagine Video 1.5", + "display_name": "Grok Imagine Video 1.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1024, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-05-30", + "last_updated": "2026-05-30", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "grok-4.20-multi-agent-0309", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -113210,75 +115703,72 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 30000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "grok-imagine-image-quality", + "name": "Grok Imagine Image Quality", + "display_name": "Grok Imagine Image Quality", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "text" + "image", + "pdf" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "open_weights": false, + "release_date": "2026-04-03", + "last_updated": "2026-04-03", "type": "chat" }, { - "id": "deepseek/deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -113288,26 +115778,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", @@ -113319,54 +115802,30 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", @@ -113378,429 +115837,308 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "grok-imagine-image", + "name": "Grok Imagine Image", + "display_name": "Grok Imagine Image", "modalities": { "input": [ "text", "image", "pdf" ], + "output": [ + "image", + "pdf" + ] + }, + "limit": { + "context": 8000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-28", + "last_updated": "2026-01-28", + "type": "chat" + }, + { + "id": "grok-3-mini-fast-beta", + "name": "Grok 3 Mini Fast Beta", + "display_name": "Grok 3 Mini Fast Beta", + "modalities": { + "input": [ + "text" + ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true, + "effort": "low" }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "grok-3-mini-beta", + "name": "Grok 3 Mini Beta", + "display_name": "Grok 3 Mini Beta", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 120000, + "output": 100000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true, + "effort": "low" }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "grok-3-fast-beta", + "name": "Grok 3 Fast Beta", + "display_name": "Grok 3 Fast Beta", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, "type": "chat" }, { - "id": "anthropic/claude-sonnet-4", - "name": "Claude Sonnet 4 (latest)", - "display_name": "Claude Sonnet 4 (latest)", + "id": "grok-2-vision-1212", + "name": "Grok 2 Vision 1212", + "display_name": "Grok 2 Vision 1212", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "grok-2-image-1212", + "name": "Grok 2 Image 1212", + "display_name": "Grok 2 Image 1212", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 130000, + "output": 100000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, "type": "chat" }, { - "id": "anthropic/claude-opus-4", - "name": "Claude Opus 4 (latest)", - "display_name": "Claude Opus 4 (latest)", + "id": "grok-3-beta", + "name": "Grok 3 Beta", + "display_name": "Grok 3 Beta", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "grok-2-1212", + "name": "Grok 2 1212", + "display_name": "Grok 2 1212", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 120000, + "output": 100000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "search": { + "supported": false + }, + "attachment": false, + "type": "chat" + } + ] + }, + "hetzner": { + "id": "hetzner", + "name": "Hetzner", + "display_name": "Hetzner", + "api": "https://inference.hetzner.com/api/v1", + "doc": "https://experiments.hetzner.com/docs/inference", + "models": [ + { + "id": "Qwen/Qwen3.6-35B-A3B-FP8", + "name": "Qwen3.6 35B A3B FP8", + "display_name": "Qwen3.6 35B A3B FP8", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "zenifra": { + "id": "zenifra", + "name": "Zenifra", + "display_name": "Zenifra", + "api": "https://ai.zenifra.com/v1", + "doc": "https://docs.zenifra.com", + "models": [ { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "alibaba/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text" @@ -113810,8 +116148,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -113830,16 +116168,25 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "morph": { + "id": "morph", + "name": "Morph", + "display_name": "Morph", + "api": "https://api.morphllm.com/v1", + "doc": "https://docs.morphllm.com/api-reference/introduction", + "models": [ { - "id": "z-ai/glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "morph-v3-large", + "name": "Morph v3 Large", + "display_name": "Morph v3 Large", "modalities": { "input": [ "text" @@ -113849,26 +116196,24 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "release_date": "2024-08-15", + "last_updated": "2024-08-15", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "auto", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ "text" @@ -113878,36 +116223,29 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "morph-v3-fast", + "name": "Morph v3 Fast", + "display_name": "Morph v3 Fast", "modalities": { "input": [ "text" @@ -113917,60 +116255,73 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 16000, + "output": 16000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "open_weights": false, + "release_date": "2024-08-15", + "last_updated": "2024-08-15", "type": "chat" - }, + } + ] + }, + "umans-ai-coding-plan": { + "id": "umans-ai-coding-plan", + "name": "Umans AI Coding Plan", + "display_name": "Umans AI Coding Plan", + "api": "https://api.code.umans.ai/v1", + "doc": "https://app.umans.ai/offers/code/docs", + "models": [ { - "id": "z-ai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "umans-flash", + "name": "Umans Flash", + "display_name": "Umans Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "umans-deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -113980,8 +116331,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 393215 }, "temperature": true, "tool_call": true, @@ -114002,15 +116353,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "umans-kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -114021,47 +116372,36 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "umans-coder", + "name": "Umans Coder", + "display_name": "Umans Coder", "modalities": { "input": [ "text", @@ -114072,8 +116412,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -114084,49 +116424,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "umans-glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 405504, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -114134,80 +116464,107 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "umans-kimi-k2.7", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "umans-qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "umans-glm-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ "text", @@ -114218,10 +116575,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -114230,34 +116587,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - }, + } + ] + }, + "mistral": { + "id": "mistral", + "name": "Mistral", + "display_name": "Mistral", + "doc": "https://docs.mistral.ai/getting-started/models/", + "models": [ { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "mistral-small-2506", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", @@ -114268,25 +116623,25 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "openai/gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat", - "display_name": "GPT-5.2 Chat", + "id": "pixtral-large-latest", + "name": "Pixtral Large (latest)", + "display_name": "Pixtral Large (latest)", "modalities": { "input": [ "text", @@ -114298,107 +116653,81 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2024-11-04", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "pixtral-12b", + "name": "Pixtral 12B", + "display_name": "Pixtral 12B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2024-09-01", + "last_updated": "2024-09-01", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "open-mixtral-8x7b", + "name": "Mixtral 8x7B", + "display_name": "Mixtral 8x7B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2024-01", + "release_date": "2023-12-11", + "last_updated": "2023-12-11", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "labs-devstral-small-2512", + "name": "Devstral Small 2", + "display_name": "Devstral Small 2", "modalities": { "input": [ "text", @@ -114409,185 +116738,138 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "openai/gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "magistral-medium-latest", + "name": "Magistral Medium (latest)", + "display_name": "Magistral Medium (latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5-turbo", - "display_name": "GPT-3.5-turbo", + "id": "mistral-medium-2508", + "name": "Mistral Medium 3.1", + "display_name": "Mistral Medium 3.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "knowledge": "2025-05", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "GPT-4o (2024-05-13)", - "display_name": "GPT-4o (2024-05-13)", + "id": "mistral-large-2411", + "name": "Mistral Large 2.1", + "display_name": "Mistral Large 2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-18", + "last_updated": "2024-11-18", "type": "chat" }, { - "id": "openai/gpt-5-chat-latest", - "name": "GPT-5 Chat (latest)", - "display_name": "GPT-5 Chat (latest)", + "id": "voxtral-mini-tts-latest", + "name": "Voxtral Mini TTS (latest)", + "display_name": "Voxtral Mini TTS (latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ "text", @@ -114598,211 +116880,138 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "devstral-small-2507", + "name": "Devstral Small", + "display_name": "Devstral Small", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2025-07-10", + "last_updated": "2025-07-10", "type": "chat" }, { - "id": "openai/gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat (latest)", - "display_name": "GPT-5.3 Chat (latest)", + "id": "open-mistral-7b", + "name": "Mistral 7B", + "display_name": "Mistral 7B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2023-09-27", + "last_updated": "2023-09-27", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "ministral-3b-latest", + "name": "Ministral 3B (latest)", + "display_name": "Ministral 3B (latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-10-01", + "last_updated": "2024-10-04", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "mistral-small-latest", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ "text", @@ -114813,197 +117022,112 @@ ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "open-mixtral-8x22b", + "name": "Mixtral 8x22B", + "display_name": "Mixtral 8x22B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 64000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-04-17", + "last_updated": "2024-04-17", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "mistral-medium-2604", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", @@ -115014,110 +117138,64 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "voxtral-mini-latest", + "name": "Voxtral Mini (latest)", + "display_name": "Voxtral Mini (latest)", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "voxtral-small-latest", + "name": "Voxtral Small (latest)", + "display_name": "Voxtral Small (latest)", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -115125,228 +117203,154 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "devstral-latest", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "ministral-8b-latest", + "name": "Ministral 8B (latest)", + "display_name": "Ministral 8B (latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-10-01", + "last_updated": "2024-10-04", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "mistral-embed", + "name": "Mistral Embed", + "display_name": "Mistral Embed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8000, + "output": 3072 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2023-12-11", + "last_updated": "2023-12-11", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "codestral-latest", + "name": "Codestral (latest)", + "display_name": "Codestral (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 256000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-05-29", + "last_updated": "2025-01-04", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "devstral-medium-latest", + "name": "Devstral 2 (latest)", + "display_name": "Devstral 2 (latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ "text" @@ -115356,25 +117360,25 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "openai/gpt-5.1-chat-latest", - "name": "GPT-5.1 Chat", - "display_name": "GPT-5.1 Chat", + "id": "mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", @@ -115385,171 +117389,110 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "kimi/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "devstral-medium-2507", + "name": "Devstral Medium", + "display_name": "Devstral Medium", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", - "type": "chat" + "knowledge": "2025-05", + "release_date": "2025-07-10", + "last_updated": "2025-07-10", + "type": "chat" }, { - "id": "kimi/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "devstral-small-2505", + "name": "Devstral Small 2505", + "display_name": "Devstral Small 2505", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "chat" - } - ] - }, - "xiaomi-token-plan-cn": { - "id": "xiaomi-token-plan-cn", - "name": "Xiaomi Token Plan (China)", - "display_name": "Xiaomi Token Plan (China)", - "api": "https://token-plan-cn.xiaomimimo.com/v1", - "doc": "https://platform.xiaomimimo.com/#/docs", - "models": [ - { - "id": "mimo-v2.5-tts", - "name": "MiMo-V2.5-TTS", - "display_name": "MiMo-V2.5-TTS", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "mimo-v2-tts", - "name": "MiMo-V2-TTS", - "display_name": "MiMo-V2-TTS", + "id": "magistral-small", + "name": "Magistral Small", + "display_name": "Magistral Small", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "mimo-v2-pro", - "name": "MiMo-V2-Pro", - "display_name": "MiMo-V2-Pro", + "id": "open-mistral-nemo", + "name": "Open Mistral Nemo", + "display_name": "Open Mistral Nemo", "modalities": { "input": [ "text" @@ -115559,79 +117502,77 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "mimo-v2.5-tts-voicedesign", - "name": "MiMo-V2.5-TTS-VoiceDesign", - "display_name": "MiMo-V2.5-TTS-VoiceDesign", + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" - }, + } + ] + }, + "umans-ai": { + "id": "umans-ai", + "name": "Umans AI", + "display_name": "Umans AI", + "api": "https://api.code.umans.ai/v1", + "doc": "https://app.umans.ai/offers/code/docs/orgs", + "models": [ { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "umans-flash", + "name": "Umans Flash", + "display_name": "Umans Flash", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115650,41 +117591,14 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" - }, - { - "id": "mimo-v2.5-tts-voiceclone", - "name": "MiMo-V2.5-TTS-VoiceClone", - "display_name": "MiMo-V2.5-TTS-VoiceClone", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "umans-deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -115695,7 +117609,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 393215 }, "temperature": true, "tool_call": true, @@ -115716,23 +117630,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" - } - ] - }, - "v0": { - "id": "v0", - "name": "v0", - "display_name": "v0", - "doc": "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", - "models": [ + }, { - "id": "v0-1.0-md", - "name": "v0-1.0-md", - "display_name": "v0-1.0-md", + "id": "umans-kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -115743,25 +117649,36 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "v0-1.5-lg", - "name": "v0-1.5-lg", - "display_name": "v0-1.5-lg", + "id": "umans-coder", + "name": "Umans Coder", + "display_name": "Umans Coder", "modalities": { "input": [ "text", @@ -115772,25 +117689,37 @@ ] }, "limit": { - "context": 512000, - "output": 32000 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2025-06-09", - "last_updated": "2025-06-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "v0-1.5-md", - "name": "v0-1.5-md", - "display_name": "v0-1.5-md", + "id": "umans-glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text", @@ -115801,45 +117730,8 @@ ] }, "limit": { - "context": 128000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-09", - "last_updated": "2025-06-09", - "type": "chat" - } - ] - }, - "poolside": { - "id": "poolside", - "name": "Poolside", - "display_name": "Poolside", - "api": "https://inference.poolside.ai/v1", - "doc": "https://platform.poolside.ai", - "models": [ - { - "id": "poolside/laguna-xs-2.1", - "name": "Laguna XS 2.1", - "display_name": "Laguna XS 2.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 + "context": 405504, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -115860,27 +117752,29 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "poolside/laguna-s-2.1", - "name": "Laguna S 2.1", - "display_name": "Laguna S 2.1", + "id": "umans-kimi-k2.7", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115897,27 +117791,29 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "poolside/laguna-m.1", - "name": "Laguna M.1", - "display_name": "Laguna M.1", + "id": "umans-glm-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -115938,27 +117834,29 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" } ] }, - "routing-run": { - "id": "routing-run", - "name": "routing.run", - "display_name": "routing.run", - "api": "https://api.routing.run/v1", - "doc": "https://docs.routing.run/api-reference/models", + "ofox": { + "id": "ofox", + "name": "Ofox", + "display_name": "Ofox", + "api": "https://api.ofox.ai/v1", + "doc": "https://ofox.ai/docs", "models": [ { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -115966,59 +117864,46 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -116026,9 +117911,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -116037,23 +117922,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -116062,20 +117930,22 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -116083,7 +117953,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 30000 }, "temperature": true, "tool_call": true, @@ -116093,26 +117963,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -116125,18 +117988,18 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -116148,82 +118011,100 @@ ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116231,25 +118112,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "nemotron-3-ultra", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -116259,8 +118135,8 @@ ] }, "limit": { - "context": 131072, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -116270,23 +118146,17 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "kimi-k2.6", + "id": "moonshotai/kimi-k2.6", "name": "Kimi K2.6", "display_name": "Kimi K2.6", "modalities": { @@ -116300,8 +118170,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -116311,13 +118181,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, @@ -116328,22 +118192,24 @@ "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116352,38 +118218,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "glm-5.2-nitro", - "name": "GLM 5.2 Nitro", - "display_name": "GLM 5.2 Nitro", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116392,22 +118272,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gpt-5.6-luna", + "id": "openai/gpt-5.6-luna", "name": "GPT-5.6 Luna", "display_name": "GPT-5.6 Luna", "modalities": { @@ -116421,7 +118312,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -116450,12 +118341,7 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, @@ -116466,24 +118352,24 @@ "type": "chat" }, { - "id": "kimi-k2.6-nitro", - "name": "Kimi K2.6 Nitro", - "display_name": "Kimi K2.6 Nitro", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116492,40 +118378,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "bailian/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -116533,72 +118429,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" - }, + } + ] + }, + "orcarouter": { + "id": "orcarouter", + "name": "OrcaRouter", + "display_name": "OrcaRouter", + "api": "https://api.orcarouter.ai/v1", + "doc": "https://docs.orcarouter.ai", + "models": [ { - "id": "kimi-k2.7-code-nitro", - "name": "Kimi K2.7 Code Nitro", - "display_name": "Kimi K2.7 Code Nitro", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -116606,10 +118497,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -116619,49 +118510,33 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - } - ] - }, - "google-vertex": { - "id": "google-vertex", - "name": "Vertex", - "display_name": "Vertex", - "doc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", - "models": [ + }, { - "id": "gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", @@ -116684,17 +118559,22 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", @@ -116739,20 +118619,20 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", - "audio", "video", + "audio", "pdf" ], "output": [ @@ -116773,15 +118653,12 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ @@ -116792,29 +118669,26 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -116828,64 +118702,49 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gemini-2.5-pro-tts", - "name": "Gemini 2.5 Pro TTS", - "display_name": "Gemini 2.5 Pro TTS", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-30", - "last_updated": "2025-12-10", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", @@ -116910,54 +118769,71 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gemini-2.5-flash-tts", - "name": "Gemini 2.5 Flash TTS", - "display_name": "Gemini 2.5 Flash TTS", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-09-30", - "last_updated": "2025-12-10", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "video", "audio", + "video", "pdf" ], "output": [ @@ -116978,14 +118854,14 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ @@ -116996,14 +118872,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", @@ -117046,48 +118922,20 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2048, - "output": 1 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" - }, - { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", "image", - "video", "audio", + "video", "pdf" ], "output": [ @@ -117102,20 +118950,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ @@ -117125,29 +118973,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", "image", "video", - "audio", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, "temperature": true, @@ -117158,104 +119005,84 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "imageGeneration" - }, - { - "id": "gemini-2.5-flash-image", - "name": "Nano Banana", - "display_name": "Nano Banana", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", - "type": "imageGeneration" + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", + "type": "chat" }, { - "id": "gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -117263,45 +119090,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "imageGeneration" + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", "image", "video", - "audio", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, "temperature": true, @@ -117313,78 +119132,76 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", "image", - "audio", "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, "temperature": true, @@ -117396,96 +119213,80 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "zai-org/glm-5-maas", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -117504,68 +119305,62 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai-org/glm-4.7-maas", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "orcarouter/auto", + "name": "OrcaRouter Auto", + "display_name": "OrcaRouter Auto", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-06", - "last_updated": "2026-01-06", + "attachment": true, + "open_weights": false, + "release_date": "2025-01-01", + "last_updated": "2026-05-14", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-instruct-2507-maas", - "name": "Qwen3 235B A22B Instruct", - "display_name": "Qwen3 235B A22B Instruct", + "id": "grok/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -117573,45 +119368,60 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-13", - "last_updated": "2025-08-13", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "meta/llama-4-maverick-17b-128e-instruct-maas", - "name": "Llama 4 Maverick 17B 128E Instruct", - "display_name": "Llama 4 Maverick 17B 128E Instruct", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "meta/llama-3.3-70b-instruct-maas", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -117621,37 +119431,47 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.1-maas", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "minimax/minimax-m2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -117659,28 +119479,32 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.2-maas", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -117688,16 +119512,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-12-17", - "last_updated": "2026-04-04", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking-maas", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -117707,8 +119536,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -117729,15 +119558,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-oss-20b-maas", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -117747,8 +119576,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -117756,16 +119585,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-oss-120b-maas", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ "text" @@ -117775,34 +119616,25 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" - } - ] - }, - "tencent-token-plan": { - "id": "tencent-token-plan", - "name": "Tencent Token Plan", - "display_name": "Tencent Token Plan", - "api": "https://api.lkeap.cloud.tencent.com/plan/v3", - "doc": "https://cloud.tencent.com/document/product/1823/130060", - "models": [ + }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "deepseek/deepseek-reasoner", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ "text" @@ -117812,8 +119644,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -117823,352 +119655,465 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" - } - ] - }, - "synthetic": { - "id": "synthetic", - "name": "Synthetic", - "display_name": "Synthetic", - "api": "https://api.synthetic.new/openai/v1", - "doc": "https://synthetic.new/pricing", - "models": [ + }, { - "id": "hf:Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "hf:moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "hf:moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-27", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "hf:openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "hf:zai-org/GLM-4.7-Flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4 (latest)", + "display_name": "Claude Sonnet 4 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "hf:zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "hf:MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "anthropic/claude-opus-4", + "name": "Claude Opus 4 (latest)", + "display_name": "Claude Opus 4 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" - } - ] - }, - "zai-coding-plan": { - "id": "zai-coding-plan", - "name": "Z.AI Coding Plan", - "display_name": "Z.AI Coding Plan", - "api": "https://api.z.ai/api/coding/paas/v4", - "doc": "https://docs.z.ai/devpack/overview", - "models": [ + }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -118176,35 +120121,53 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-5.2-highspeed", - "name": "GLM-5.2 Highspeed", - "display_name": "GLM-5.2 Highspeed", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -118214,7 +120177,7 @@ ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -118236,14 +120199,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "z-ai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ "text" @@ -118253,8 +120216,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -118262,28 +120225,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -118314,24 +120266,15 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - } - ] - }, - "gmicloud": { - "id": "gmicloud", - "name": "GMI Cloud", - "display_name": "GMI Cloud", - "api": "https://api.gmi-serving.com/v1", - "doc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", - "models": [ + }, { - "id": "zai-org/GLM-5.1-FP8", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "z-ai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -118341,7 +120284,7 @@ ] }, "limit": { - "context": 202752, + "context": 204800, "output": 131072 }, "temperature": true, @@ -118352,25 +120295,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "zai-org/GLM-5-FP8", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "z-ai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -118380,8 +120318,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -118389,27 +120327,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "zai-org/GLM-5.2-FP8", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -118419,7 +120347,7 @@ ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -118441,60 +120369,80 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "Qwen/Qwen3.7-Max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048575, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -118503,38 +120451,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -118542,305 +120501,285 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 409600, - "output": 64000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", + "type": "chat" + }, + { + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 409600, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ - "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "openai/gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat", + "display_name": "GPT-5.2 Chat", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 409600, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -118849,37 +120788,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -118895,10 +120843,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -118909,85 +120857,133 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" - } - ] - }, - "freemodel": { - "id": "freemodel", - "name": "FreeModel", - "display_name": "FreeModel", - "api": "https://cc.freemodel.dev/v1", - "doc": "https://freemodel.dev", - "models": [ + }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16385, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", + "type": "chat" + }, + { + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", + "type": "chat" + }, + { + "id": "openai/gpt-5-chat-latest", + "name": "GPT-5 Chat (latest)", + "display_name": "GPT-5 Chat (latest)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -118999,10 +120995,10 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -119012,41 +121008,64 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "openai/gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat (latest)", + "display_name": "GPT-5.3 Chat (latest)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", + "type": "chat" + }, + { + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -119058,7 +121077,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -119072,50 +121091,44 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -119129,51 +121142,46 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 400000, + "output": 272000 }, "temperature": false, "tool_call": true, @@ -119185,14 +121193,8 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], + "mode": "fixed", + "effort": "high", "verbosity": "medium", "verbosity_options": [ "low", @@ -119204,27 +121206,26 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -119258,14 +121259,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -119310,12 +121311,12 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gpt-5.3-codex", + "id": "openai/gpt-5.3-codex", "name": "GPT-5.3 Codex", "display_name": "GPT-5.3 Codex", "modalities": { @@ -119367,73 +121368,71 @@ "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -119447,78 +121446,37 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", - "type": "chat" - } - ] - }, - "amazon-bedrock": { - "id": "amazon-bedrock", - "name": "Amazon Bedrock", - "display_name": "Amazon Bedrock", - "doc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", - "models": [ - { - "id": "zai.glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "us.deepseek.r1-v1:0", - "name": "DeepSeek-R1 (US)", - "display_name": "DeepSeek-R1 (US)", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -119526,64 +121484,64 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "qwen.qwen3-next-80b-a3b", - "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "display_name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-18", - "last_updated": "2025-11-25", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (Global)", - "display_name": "Claude Opus 4.8 (Global)", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -119597,186 +121555,165 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" - }, - { - "id": "nvidia.nemotron-super-3-120b", - "name": "NVIDIA Nemotron 3 Super 120B A12B", - "display_name": "NVIDIA Nemotron 3 Super 120B A12B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5 (EU)", - "display_name": "Claude Opus 4.5 (EU)", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "mistral.mistral-large-3-675b-instruct", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "moonshot.kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262143, - "output": 16000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistral.devstral-2-123b", - "name": "Devstral 2 123B", - "display_name": "Devstral 2 123B", + "id": "openai/gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ "text" @@ -119786,7 +121723,7 @@ ] }, "limit": { - "context": 256000, + "context": 8192, "output": 8192 }, "temperature": true, @@ -119794,468 +121731,327 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "attachment": true, + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "minimax.minimax-m2", - "name": "MiniMax M2", - "display_name": "MiniMax M2", + "id": "openai/gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat", + "display_name": "GPT-5.1 Chat", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204608, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (JP)", - "display_name": "Claude Opus 4.8 (JP)", + "id": "kimi/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" - }, - { - "id": "mistral.voxtral-small-24b-2507", - "name": "Voxtral Small 24B 2507", - "display_name": "Voxtral Small 24B 2507", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, "open_weights": true, - "release_date": "2025-07-01", - "last_updated": "2025-07-01", - "type": "chat" - }, - { - "id": "openai.gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 272000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "au.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (AU)", - "display_name": "Claude Haiku 4.5 (AU)", + "id": "kimi/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" - }, + } + ] + }, + "xiaomi-token-plan-cn": { + "id": "xiaomi-token-plan-cn", + "name": "Xiaomi Token Plan (China)", + "display_name": "Xiaomi Token Plan (China)", + "api": "https://token-plan-cn.xiaomimimo.com/v1", + "doc": "https://platform.xiaomimimo.com/#/docs", + "models": [ { - "id": "mistral.magistral-small-2509", - "name": "Magistral Small 1.2", - "display_name": "Magistral Small 1.2", + "id": "mimo-v2.5-tts", + "name": "MiMo-V2.5-TTS", + "display_name": "MiMo-V2.5-TTS", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 40000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (EU)", - "display_name": "Claude Haiku 4.5 (EU)", + "id": "mimo-v2-tts", + "name": "MiMo-V2-TTS", + "display_name": "MiMo-V2-TTS", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "mimo-v2-pro", + "name": "MiMo-V2-Pro", + "display_name": "MiMo-V2-Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic.claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "mimo-v2.5-tts-voicedesign", + "name": "MiMo-V2.5-TTS-VoiceDesign", + "display_name": "MiMo-V2.5-TTS-VoiceDesign", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "us.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (US)", - "display_name": "Claude Sonnet 5 (US)", + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "meta.llama3-3-70b-instruct-v1:0", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "mimo-v2.5-tts-voiceclone", + "name": "MiMo-V2.5-TTS-VoiceClone", + "display_name": "MiMo-V2.5-TTS-VoiceClone", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "mistral.ministral-3-8b-instruct", - "name": "Ministral 3 8B", - "display_name": "Ministral 3 8B", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ "text" @@ -120265,91 +122061,88 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - }, + } + ] + }, + "v0": { + "id": "v0", + "name": "v0", + "display_name": "v0", + "doc": "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", + "models": [ { - "id": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (AU)", - "display_name": "Claude Sonnet 4.5 (AU)", + "id": "v0-1.0-md", + "name": "v0-1.0-md", + "display_name": "v0-1.0-md", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "openai.gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "v0-1.5-lg", + "name": "v0-1.5-lg", + "display_name": "v0-1.5-lg", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 512000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -120357,18 +122150,18 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2025-06-09", + "last_updated": "2025-06-09", "type": "chat" }, { - "id": "openai.gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "v0-1.5-md", + "name": "v0-1.5-md", + "display_name": "v0-1.5-md", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -120376,7 +122169,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -120384,16 +122177,25 @@ "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-06-09", + "last_updated": "2025-06-09", "type": "chat" - }, + } + ] + }, + "poolside": { + "id": "poolside", + "name": "Poolside", + "display_name": "Poolside", + "api": "https://inference.poolside.ai/v1", + "doc": "https://platform.poolside.ai", + "models": [ { - "id": "writer.palmyra-x4-v1:0", - "name": "Palmyra X4", - "display_name": "Palmyra X4", + "id": "poolside/laguna-xs-2.1", + "name": "Laguna XS 2.1", + "display_name": "Laguna XS 2.1", "modalities": { "input": [ "text" @@ -120403,8 +122205,8 @@ ] }, "limit": { - "context": 122880, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -120412,16 +122214,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "open_weights": true, + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "zai.glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "poolside/laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ "text" @@ -120431,8 +122244,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -120453,46 +122266,62 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "poolside/laguna-m.1", + "name": "Laguna M.1", + "display_name": "Laguna M.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-06-13", "type": "chat" - }, + } + ] + }, + "routing-run": { + "id": "routing-run", + "name": "routing.run", + "display_name": "routing.run", + "api": "https://api.routing.run/v1", + "doc": "https://docs.routing.run/api-reference/models", + "models": [ { - "id": "us.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (US)", - "display_name": "Claude Sonnet 4.6 (US)", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -120549,9 +122378,9 @@ "type": "chat" }, { - "id": "au.anthropic.claude-sonnet-4-6", - "name": "AU Anthropic Claude Sonnet 4.6", - "display_name": "AU Anthropic Claude Sonnet 4.6", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -120566,51 +122395,51 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", + "xhigh", "max" ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai.gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -120620,83 +122449,37 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", - "type": "chat" - }, - { - "id": "global.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (Global)", - "display_name": "Claude Sonnet 5 (Global)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", - "type": "chat" - }, - { - "id": "meta.llama3-1-8b-instruct-v1:0", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "jp.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (JP)", - "display_name": "Claude Sonnet 5 (JP)", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -120709,200 +122492,212 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "nvidia.nemotron-nano-12b-v2", - "name": "NVIDIA Nemotron Nano 12B v2 VL BF16", - "display_name": "NVIDIA Nemotron Nano 12B v2 VL BF16", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6 (US)", - "display_name": "Claude Opus 4.6 (US)", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (EU)", - "display_name": "Claude Opus 4.8 (EU)", + "id": "nemotron-3-ultra", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "openai.gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "nvidia.nemotron-nano-9b-v2", - "name": "NVIDIA Nemotron Nano 9B v2", - "display_name": "NVIDIA Nemotron Nano 9B v2", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -120912,24 +122707,37 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "meta.llama3-1-70b-instruct-v1:0", - "name": "Llama 3.1 70B Instruct", - "display_name": "Llama 3.1 70B Instruct", + "id": "glm-5.2-nitro", + "name": "GLM 5.2 Nitro", + "display_name": "GLM 5.2 Nitro", "modalities": { "input": [ "text" @@ -120939,25 +122747,36 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "jp.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (JP)", - "display_name": "Claude Sonnet 4.6 (JP)", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -120970,87 +122789,100 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", + "xhigh", "max" ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "us.meta.llama4-scout-17b-instruct-v1:0", - "name": "Llama 4 Scout 17B Instruct (US)", - "display_name": "Llama 4 Scout 17B Instruct (US)", + "id": "kimi-k2.6-nitro", + "name": "Kimi K2.6 Nitro", + "display_name": "Kimi K2.6 Nitro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 3500000, - "output": 16384 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -121058,59 +122890,49 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-5", - "name": "Claude Opus 5 (JP)", - "display_name": "Claude Opus 5 (JP)", + "id": "kimi-k2.7-code-nitro", + "name": "Kimi K2.7 Code Nitro", + "display_name": "Kimi K2.7 Code Nitro", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": false, "tool_call": true, @@ -121118,17 +122940,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "global.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (Global)", - "display_name": "Claude Haiku 4.5 (Global)", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -121140,51 +122973,68 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "google-vertex": { + "id": "google-vertex", + "name": "Vertex", + "display_name": "Vertex", + "doc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "models": [ { - "id": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (JP)", - "display_name": "Claude Sonnet 4.5 (JP)", + "id": "gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -121192,58 +123042,41 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai.gpt-oss-120b-1:0", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -121251,20 +123084,42 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (US)", - "display_name": "Claude Sonnet 4.5 (US)", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -121272,107 +123127,138 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, "unit": "tokens" }, - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "mistral.voxtral-mini-3b-2507", - "name": "Voxtral Mini 3B 2507", - "display_name": "Voxtral Mini 3B 2507", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ + "text", + "image", + "video", "audio", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openai.gpt-oss-20b-1:0", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "gemini-2.5-pro-tts", + "name": "Gemini 2.5 Pro TTS", + "display_name": "Gemini 2.5 Pro TTS", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, + "context": 32768, "output": 16384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": false, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-09-30", + "last_updated": "2025-12-10", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6 (EU)", - "display_name": "Claude Opus 4.6 (EU)", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -121380,87 +123266,65 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "us.meta.llama4-maverick-17b-instruct-v1:0", - "name": "Llama 4 Maverick 17B Instruct (US)", - "display_name": "Llama 4 Maverick 17B Instruct (US)", + "id": "gemini-2.5-flash-tts", + "name": "Gemini 2.5 Flash TTS", + "display_name": "Gemini 2.5 Flash TTS", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1000000, + "context": 32768, "output": 16384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-09-30", + "last_updated": "2025-12-10", "type": "chat" }, { - "id": "us.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (US)", - "display_name": "Claude Haiku 4.5 (US)", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -121468,51 +123332,51 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "global.anthropic.claude-fable-5", - "name": "Claude Fable 5 (Global)", - "display_name": "Claude Fable 5 (Global)", + "id": "gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -121520,10 +123384,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -121533,72 +123397,64 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "meta.llama4-scout-17b-instruct-v1:0", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 3500000, - "output": 16384 + "context": 2048, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "type": "chat" + "attachment": false, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (JP)", - "display_name": "Claude Haiku 4.5 (JP)", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -121606,58 +123462,60 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen.qwen3-32b-v1:0", - "name": "Qwen3 32B (dense)", - "display_name": "Qwen3 32B (dense)", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -121665,159 +123523,227 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (Global)", - "display_name": "Claude Sonnet 4.5 (Global)", + "id": "gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "google.gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "imageGeneration" }, { - "id": "qwen.qwen3-coder-30b-a3b-v1:0", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ - "text" + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 65536, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" + }, + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "amazon.nova-pro-v1:0", - "name": "Nova Pro", - "display_name": "Nova Pro", + "id": "gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (US)", - "display_name": "Claude Opus 4.7 (US)", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -121825,85 +123751,95 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "moonshotai.kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262143, - "output": 16000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "zai.glm-5", + "id": "zai-org/glm-5-maas", "name": "GLM-5", "display_name": "GLM-5", "modalities": { @@ -121916,7 +123852,7 @@ }, "limit": { "context": 202752, - "output": 101376 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -121937,42 +123873,55 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "amazon.nova-micro-v1:0", - "name": "Nova Micro", - "display_name": "Nova Micro", + "id": "zai-org/glm-4.7-maas", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-06", + "last_updated": "2026-01-06", "type": "chat" }, { - "id": "deepseek.r1-v1:0", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "qwen/qwen3-235b-a22b-instruct-2507-maas", + "name": "Qwen3 235B A22B Instruct", + "display_name": "Qwen3 235B A22B Instruct", "modalities": { "input": [ "text" @@ -121982,8 +123931,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -121992,47 +123941,44 @@ "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "open_weights": true, + "release_date": "2025-08-13", + "last_updated": "2025-08-13", "type": "chat" }, { - "id": "au.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (AU)", - "display_name": "Claude Sonnet 5 (AU)", + "id": "meta/llama-4-maverick-17b-128e-instruct-maas", + "name": "Llama 4 Maverick 17B 128E Instruct", + "display_name": "Llama 4 Maverick 17B 128E Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 524288, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "deepseek.v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "meta/llama-3.3-70b-instruct-maas", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -122041,9 +123987,38 @@ "text" ] }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "type": "chat" + }, + { + "id": "deepseek-ai/deepseek-v3.1-maas", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", + "modalities": { + "input": [ + "text", + "pdf" + ], + "output": [ + "text" + ] + }, "limit": { "context": 163840, - "output": 81920 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -122053,410 +124028,350 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "qwen.qwen3-coder-480b-a35b-v1:0", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "deepseek-ai/deepseek-v3.2-maas", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 163840, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "release_date": "2025-12-17", + "last_updated": "2026-04-04", "type": "chat" }, { - "id": "au.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (AU)", - "display_name": "Claude Opus 4.8 (AU)", + "id": "moonshotai/kimi-k2-thinking-maas", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-oss-20b-maas", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "openai/gpt-oss-120b-maas", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + } + ] + }, + "tencent-token-plan": { + "id": "tencent-token-plan", + "name": "Tencent Token Plan", + "display_name": "Tencent Token Plan", + "api": "https://api.lkeap.cloud.tencent.com/plan/v3", + "doc": "https://cloud.tencent.com/document/product/1823/130060", + "models": [ + { + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" - }, + } + ] + }, + "synthetic": { + "id": "synthetic", + "name": "Synthetic", + "display_name": "Synthetic", + "api": "https://api.synthetic.new/openai/v1", + "doc": "https://synthetic.new/pricing", + "models": [ { - "id": "openai.gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "hf:Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-06-01", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "global.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (Global)", - "display_name": "Claude Sonnet 4.6 (Global)", + "id": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (EU)", - "display_name": "Claude Opus 4.7 (EU)", + "id": "hf:moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (EU)", - "display_name": "Claude Sonnet 4.5 (EU)", + "id": "hf:moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-27", "type": "chat" }, { - "id": "mistral.ministral-3-14b-instruct", - "name": "Ministral 14B 3.0", - "display_name": "Ministral 14B 3.0", + "id": "hf:openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -122466,206 +124381,200 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "us.anthropic.claude-opus-5", - "name": "Claude Opus 5 (US)", - "display_name": "Claude Opus 5 (US)", + "id": "hf:zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 196608, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "hf:zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6 (Global)", - "display_name": "Claude Opus 4.6 (Global)", + "id": "hf:MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" - }, + } + ] + }, + "zai-coding-plan": { + "id": "zai-coding-plan", + "name": "Z.AI Coding Plan", + "display_name": "Z.AI Coding Plan", + "api": "https://api.z.ai/api/coding/paas/v4", + "doc": "https://docs.z.ai/devpack/overview", + "models": [ { - "id": "google.gemma-3-12b-it", - "name": "Google Gemma 3 12B", - "display_name": "Google Gemma 3 12B", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (EU)", - "display_name": "Claude Sonnet 5 (EU)", + "id": "glm-5.2-highspeed", + "name": "GLM-5.2 Highspeed", + "display_name": "GLM-5.2 Highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -122673,56 +124582,75 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "global.anthropic.claude-opus-5", - "name": "Claude Opus 5 (Global)", - "display_name": "Claude Opus 5 (Global)", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "minimax.minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -122732,8 +124660,8 @@ ] }, "limit": { - "context": 196608, - "output": 98304 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -122741,106 +124669,117 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" - }, + } + ] + }, + "gmicloud": { + "id": "gmicloud", + "name": "GMI Cloud", + "display_name": "GMI Cloud", + "api": "https://api.gmi-serving.com/v1", + "doc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "models": [ { - "id": "mistral.ministral-3-3b-instruct", - "name": "Ministral 3 3B", - "display_name": "Ministral 3 3B", + "id": "zai-org/GLM-5.1-FP8", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "zai-org/GLM-5-FP8", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 202752, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-5", - "name": "Claude Opus 5 (EU)", - "display_name": "Claude Opus 5 (EU)", + "id": "zai-org/GLM-5.2-FP8", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -122848,37 +124787,158 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.7-Max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5 (Global)", - "display_name": "Claude Opus 4.5 (Global)", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1048575, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" + }, + { + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 409600, "output": 64000 }, "temperature": true, @@ -122900,7 +124960,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, @@ -122909,34 +124970,32 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic.claude-opus-4-7", + "id": "anthropic/claude-opus-4.7", "name": "Claude Opus 4.7", "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 409600, "output": 128000 }, "temperature": false, @@ -122979,38 +125038,9 @@ "type": "chat" }, { - "id": "google.gemma-3-27b-it", - "name": "Google Gemma 3 27B Instruct", - "display_name": "Google Gemma 3 27B Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 202752, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-27", - "last_updated": "2025-07-27", - "type": "chat" - }, - { - "id": "anthropic.claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -123029,63 +125059,58 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", - "type": "chat" - }, - { - "id": "xai.grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-06-28", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (US)", - "display_name": "Claude Opus 4.8 (US)", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 409600, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -123095,39 +125120,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek.v3-v1:0", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "moonshotai/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text" @@ -123137,26 +125164,37 @@ ] }, "limit": { - "context": 163840, - "output": 81920 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen.qwen3-235b-a22b-2507-v1:0", - "name": "Qwen3 235B A22B 2507", - "display_name": "Qwen3 235B A22B 2507", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text" @@ -123166,25 +125204,37 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "us.anthropic.claude-fable-5", - "name": "Claude Fable 5 (US)", - "display_name": "Claude Fable 5 (US)", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -123196,7 +125246,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -123210,38 +125260,42 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - }, + } + ] + }, + "freemodel": { + "id": "freemodel", + "name": "FreeModel", + "display_name": "FreeModel", + "api": "https://cc.freemodel.dev/v1", + "doc": "https://freemodel.dev", + "models": [ { - "id": "us.anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5 (US)", - "display_name": "Claude Opus 4.5 (US)", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -123253,7 +125307,7 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -123275,7 +125329,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, @@ -123284,50 +125339,22 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", - "type": "chat" - }, - { - "id": "nvidia.nemotron-nano-3-30b", - "name": "NVIDIA Nemotron Nano 3 30B", - "display_name": "NVIDIA Nemotron Nano 3 30B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (Global)", - "display_name": "Claude Opus 4.7 (Global)", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -123342,7 +125369,7 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -123352,39 +125379,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "au.anthropic.claude-opus-4-6-v1", - "name": "AU Anthropic Claude Opus 4.6", - "display_name": "AU Anthropic Claude Opus 4.6", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -123399,51 +125428,49 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "eu.anthropic.claude-fable-5", - "name": "Claude Fable 5 (EU)", - "display_name": "Claude Fable 5 (EU)", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -123462,12 +125489,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -123484,78 +125511,128 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen.qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai.gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen.qwen3-vl-235b-a22b", - "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "display_name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -123566,82 +125643,152 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-04", - "last_updated": "2025-11-25", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "writer.palmyra-x5-v1:0", - "name": "Palmyra X5", - "display_name": "Palmyra X5", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1040000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "amazon.nova-lite-v1:0", - "name": "Nova Lite", - "display_name": "Nova Lite", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 8192 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic.claude-opus-4-1-20250805-v1:0", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -123653,10 +125800,10 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123666,34 +125813,47 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" - }, + } + ] + }, + "amazon-bedrock": { + "id": "amazon-bedrock", + "name": "Amazon Bedrock", + "display_name": "Amazon Bedrock", + "doc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "models": [ { - "id": "minimax.minimax-m2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "zai.glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -123703,7 +125863,7 @@ ] }, "limit": { - "context": 204800, + "context": 200000, "output": 131072 }, "temperature": true, @@ -123714,74 +125874,71 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai.gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "us.deepseek.r1-v1:0", + "name": "DeepSeek-R1 (US)", + "display_name": "DeepSeek-R1 (US)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-06-01", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "meta.llama4-maverick-17b-instruct-v1:0", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "qwen.qwen3-next-80b-a3b", + "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "display_name": "Qwen/Qwen3-Next-80B-A3B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "attachment": false, + "open_weights": false, + "release_date": "2025-09-18", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "au.anthropic.claude-opus-5", - "name": "Claude Opus 5 (AU)", - "display_name": "Claude Opus 5 (AU)", + "id": "global.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (Global)", + "display_name": "Claude Opus 4.8 (Global)", "modalities": { "input": [ "text", @@ -123800,32 +125957,56 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "amazon.nova-2-lite-v1:0", - "name": "Nova 2 Lite", - "display_name": "Nova 2 Lite", + "id": "nvidia.nemotron-super-3-120b", + "name": "NVIDIA Nemotron 3 Super 120B A12B", + "display_name": "NVIDIA Nemotron 3 Super 120B A12B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -123834,15 +126015,15 @@ "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "open_weights": true, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-1-20250805-v1:0", - "name": "Claude Opus 4.1 (US)", - "display_name": "Claude Opus 4.1 (US)", + "id": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5 (EU)", + "display_name": "Claude Opus 4.5 (EU)", "modalities": { "input": [ "text", @@ -123855,7 +126036,7 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -123867,11 +126048,17 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -123879,79 +126066,139 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (JP)", - "display_name": "Claude Opus 4.7 (JP)", + "id": "mistral.mistral-large-3-675b-instruct", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "attachment": false, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "moonshot.kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262143, + "output": 16000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (EU)", - "display_name": "Claude Sonnet 4.6 (EU)", + "id": "mistral.devstral-2-123b", + "name": "Devstral 2 123B", + "display_name": "Devstral 2 123B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-17", + "last_updated": "2026-02-17", + "type": "chat" + }, + { + "id": "minimax.minimax-m2", + "name": "MiniMax M2", + "display_name": "MiniMax M2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204608, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "type": "chat" + }, + { + "id": "jp.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (JP)", + "display_name": "Claude Opus 4.8 (JP)", "modalities": { "input": [ "text", @@ -123964,9 +126211,9 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123976,52 +126223,50 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "mistral.pixtral-large-2502-v1:0", - "name": "Pixtral Large (25.02)", - "display_name": "Pixtral Large (25.02)", + "id": "mistral.voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507", + "display_name": "Voxtral Small 24B 2507", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 32000, "output": 8192 }, "temperature": true, @@ -124029,201 +126274,254 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", + "attachment": true, + "open_weights": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", "type": "chat" }, { - "id": "openai.gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "openai.gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "xiaomi-token-plan-ams": { - "id": "xiaomi-token-plan-ams", - "name": "Xiaomi Token Plan (Europe)", - "display_name": "Xiaomi Token Plan (Europe)", - "api": "https://token-plan-ams.xiaomimimo.com/v1", - "doc": "https://platform.xiaomimimo.com/#/docs", - "models": [ + }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (AU)", + "display_name": "Claude Haiku 4.5 (AU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "mimo-v2.5-tts-voiceclone", - "name": "MiMo-V2.5-TTS-VoiceClone", - "display_name": "MiMo-V2.5-TTS-VoiceClone", + "id": "mistral.magistral-small-2509", + "name": "Magistral Small 1.2", + "display_name": "Magistral Small 1.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 40000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (EU)", + "display_name": "Claude Haiku 4.5 (EU)", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "mimo-v2.5-tts-voicedesign", - "name": "MiMo-V2.5-TTS-VoiceDesign", - "display_name": "MiMo-V2.5-TTS-VoiceDesign", + "id": "anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "mimo-v2-pro", - "name": "MiMo-V2-Pro", - "display_name": "MiMo-V2-Pro", + "id": "anthropic.claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -124232,86 +126530,99 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "mimo-v2-tts", - "name": "MiMo-V2-TTS", - "display_name": "MiMo-V2-TTS", + "id": "us.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (US)", + "display_name": "Claude Sonnet 5 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "mimo-v2.5-tts", - "name": "MiMo-V2.5-TTS", - "display_name": "MiMo-V2.5-TTS", + "id": "meta.llama3-3-70b-instruct-v1:0", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 4096 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" - } - ] - }, - "minimax": { - "id": "minimax", - "name": "MiniMax (minimax.io)", - "display_name": "MiniMax (minimax.io)", - "api": "https://api.minimax.io/anthropic/v1", - "doc": "https://platform.minimax.io/docs/guides/quickstart", - "models": [ + }, { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "mistral.ministral-3-8b-instruct", + "name": "Ministral 3 8B", + "display_name": "Ministral 3 8B", "modalities": { "input": [ "text" @@ -124321,69 +126632,107 @@ ] }, "limit": { - "context": 196608, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "open_weights": false, + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (AU)", + "display_name": "Claude Sonnet 4.5 (AU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "openai.gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 272000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "openai.gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ "text" @@ -124393,8 +126742,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -124402,21 +126751,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "writer.palmyra-x4-v1:0", + "name": "Palmyra X4", + "display_name": "Palmyra X4", "modalities": { "input": [ "text" @@ -124426,8 +126770,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 122880, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -124435,21 +126779,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "MiniMax-M2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "zai.glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -124470,63 +126809,121 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" + }, + { + "id": "us.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (US)", + "display_name": "Claude Sonnet 4.6 (US)", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "au.anthropic.claude-sonnet-4-6", + "name": "AU Anthropic Claude Sonnet 4.6", + "display_name": "AU Anthropic Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -124540,31 +126937,47 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-25", + "open_weights": false, + "knowledge": "2025-08", + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" - } - ] - }, - "groq": { - "id": "groq", - "name": "Groq", - "display_name": "Groq", - "doc": "https://console.groq.com/docs/models", - "models": [ + }, { - "id": "llama-3.3-70b-versatile", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "openai.gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", "modalities": { "input": [ "text" @@ -124574,8 +126987,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -124583,16 +126996,46 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "llama-3.1-8b-instant", - "name": "Llama 3.1 8B", - "display_name": "Llama 3.1 8B", + "id": "global.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (Global)", + "display_name": "Claude Sonnet 5 (Global)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" + }, + { + "id": "meta.llama3-1-8b-instruct-v1:0", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -124602,8 +127045,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -124618,156 +127061,215 @@ "type": "chat" }, { - "id": "whisper-large-v3", - "name": "Whisper", - "display_name": "Whisper", + "id": "jp.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (JP)", + "display_name": "Claude Sonnet 5 (JP)", "modalities": { "input": [ - "audio" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2023-09-01", - "last_updated": "2025-09-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "whisper-large-v3-turbo", - "name": "Whisper Large V3 Turbo", - "display_name": "Whisper Large V3 Turbo", + "id": "nvidia.nemotron-nano-12b-v2", + "name": "NVIDIA Nemotron Nano 12B v2 VL BF16", + "display_name": "NVIDIA Nemotron Nano 12B v2 VL BF16", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01", + "open_weights": false, + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen3-32B", - "display_name": "Qwen3-32B", + "id": "us.anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6 (US)", + "display_name": "Claude Opus 4.6 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 40960 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-11", - "last_updated": "2025-06-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "canopylabs/orpheus-arabic-saudi", - "name": "Canopy Labs Orpheus Arabic Saudi", - "display_name": "Canopy Labs Orpheus Arabic Saudi", + "id": "eu.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (EU)", + "display_name": "Claude Opus 4.8 (EU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 4000, - "output": 50000 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "canopylabs/orpheus-v1-english", - "name": "Canopy Labs Orpheus V1 English", - "display_name": "Canopy Labs Orpheus V1 English", + "id": "openai.gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 4000, - "output": 50000 + "context": 272000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-12-19", - "last_updated": "2025-12-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "groq/compound-mini", - "name": "Compound Mini", - "display_name": "Compound Mini", + "id": "nvidia.nemotron-nano-9b-v2", + "name": "NVIDIA Nemotron Nano 9B v2", + "display_name": "NVIDIA Nemotron Nano 9B v2", "modalities": { "input": [ "text" @@ -124777,24 +127279,24 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-04", - "last_updated": "2025-09-04", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "groq/compound", - "name": "Compound", - "display_name": "Compound", + "id": "meta.llama3-1-70b-instruct-v1:0", + "name": "Llama 3.1 70B Instruct", + "display_name": "Llama 3.1 70B Instruct", "modalities": { "input": [ "text" @@ -124804,172 +127306,84 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-04", - "last_updated": "2025-09-04", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "jp.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (JP)", + "display_name": "Claude Sonnet 4.6 (JP)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-09-25", - "type": "chat" - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "Safety GPT OSS 20B", - "display_name": "Safety GPT OSS 20B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2026-06-29", - "type": "chat" - }, - { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-10-21", - "type": "chat" - }, - { - "id": "meta-llama/llama-prompt-guard-2-22m", - "name": "Llama Prompt Guard 2 22M", - "display_name": "Llama Prompt Guard 2 22M", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 512, - "output": 512 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-29", - "last_updated": "2025-05-29", - "type": "chat" - }, - { - "id": "meta-llama/llama-prompt-guard-2-86m", - "name": "Prompt Guard 2 86M", - "display_name": "Prompt Guard 2 86M", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 512, - "output": 512 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-29", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "meta-llama/llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B 16E", - "display_name": "Llama 4 Scout 17B 16E", + "id": "us.meta.llama4-scout-17b-instruct-v1:0", + "name": "Llama 4 Scout 17B Instruct (US)", + "display_name": "Llama 4 Scout 17B Instruct (US)", "modalities": { "input": [ "text", @@ -124980,8 +127394,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 3500000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -124994,63 +127408,68 @@ "release_date": "2025-04-05", "last_updated": "2025-04-05", "type": "chat" - } - ] - }, - "deepseek": { - "id": "deepseek", - "name": "DeepSeek", - "display_name": "DeepSeek", - "api": "https://api.deepseek.com", - "doc": "https://api-docs.deepseek.com/quick_start/pricing", - "models": [ + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "jp.anthropic.claude-opus-5", + "name": "Claude Opus 5 (JP)", + "display_name": "Claude Opus 5 (JP)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -125058,350 +127477,357 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (Global)", + "display_name": "Claude Haiku 4.5 (Global)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (JP)", + "display_name": "Claude Sonnet 4.5 (JP)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" - } - ] - }, - "kimi-for-coding": { - "id": "kimi-for-coding", - "name": "Kimi For Coding", - "display_name": "Kimi For Coding", - "api": "https://api.kimi.com/coding/v1", - "doc": "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", - "models": [ + }, { - "id": "k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai.gpt-oss-120b-1:0", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "kimi-for-coding", - "name": "K2.7 Code", - "display_name": "K2.7 Code", + "id": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (US)", + "display_name": "Claude Sonnet 4.5 (US)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04", - "last_updated": "2026-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "kimi-for-coding-highspeed", - "name": "Kimi For Coding HighSpeed", - "display_name": "Kimi For Coding HighSpeed", + "id": "mistral.voxtral-mini-3b-2507", + "name": "Voxtral Mini 3B 2507", + "display_name": "Voxtral Mini 3B 2507", "modalities": { "input": [ - "text", - "image", - "video" + "audio", + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "k3-256k", - "name": "Kimi K3-256K", - "display_name": "Kimi K3-256K", + "id": "openai.gpt-oss-20b-1:0", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "eu.anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6 (EU)", + "display_name": "Claude Opus 4.6 (EU)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04", - "last_updated": "2026-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "us.meta.llama4-maverick-17b-instruct-v1:0", + "name": "Llama 4 Maverick 17B Instruct (US)", + "display_name": "Llama 4 Maverick 17B Instruct (US)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04", - "last_updated": "2026-04", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" - } - ] - }, - "requesty": { - "id": "requesty", - "name": "Requesty", - "display_name": "Requesty", - "api": "https://router.requesty.ai/v1", - "doc": "https://requesty.ai/solution/llm-routing/models", - "models": [ + }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (US)", + "display_name": "Claude Haiku 4.5 (US)", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -125409,52 +127835,51 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "budget", "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, + "min": 1024, "unit": "tokens" }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash", - "display_name": "Gemini 3 Flash", + "id": "global.anthropic.claude-fable-5", + "name": "Claude Fable 5 (Global)", + "display_name": "Claude Fable 5 (Global)", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -125462,10 +127887,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -125475,90 +127900,72 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "meta.llama4-scout-17b-instruct-v1:0", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 3500000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "google/gemini-3-pro-preview", - "name": "Gemini 3 Pro", - "display_name": "Gemini 3 Pro", + "id": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (JP)", + "display_name": "Claude Haiku 4.5 (JP)", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -125566,78 +127973,47 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", - "type": "chat" - }, - { - "id": "xai/grok-4", - "name": "Grok 4", - "display_name": "Grok 4", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-09", - "last_updated": "2025-09-09", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "xai/grok-4-fast", - "name": "Grok 4 Fast", - "display_name": "Grok 4 Fast", + "id": "qwen.qwen3-32b-v1:0", + "name": "Qwen3 32B (dense)", + "display_name": "Qwen3 32B (dense)", "modalities": { "input": [ "text" @@ -125647,8 +128023,8 @@ ] }, "limit": { - "context": 2000000, - "output": 64000 + "context": 16384, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -125656,29 +128032,30 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-19", - "last_updated": "2025-09-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (Global)", + "display_name": "Claude Sonnet 4.5 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -125690,18 +128067,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -125709,185 +128079,108 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "google.gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 62000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-01", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "qwen.qwen3-coder-30b-a3b-v1:0", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "anthropic/claude-opus-4-1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "amazon.nova-pro-v1:0", + "name": "Nova Pro", + "display_name": "Nova Pro", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 300000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "us.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (US)", + "display_name": "Claude Opus 4.7 (US)", "modalities": { "input": [ "text", @@ -125900,9 +128193,9 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -125912,189 +128205,170 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "moonshotai.kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262143, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "interleaved": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-06", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "anthropic/claude-opus-4", - "name": "Claude Opus 4", - "display_name": "Claude Opus 4", + "id": "zai.glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 202752, + "output": 101376 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic/claude-3-7-sonnet", - "name": "Claude Sonnet 3.7", - "display_name": "Claude Sonnet 3.7", + "id": "amazon.nova-micro-v1:0", + "name": "Nova Micro", + "display_name": "Nova Micro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" - ] - } + "attachment": false, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "deepseek.r1-v1:0", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 128000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-01", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "au.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (AU)", + "display_name": "Claude Sonnet 5 (AU)", "modalities": { "input": [ "text", @@ -126106,11 +128380,99 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" + }, + { + "id": "deepseek.v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 81920 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2026-02-06", + "last_updated": "2026-02-06", + "type": "chat" + }, + { + "id": "qwen.qwen3-coder-480b-a35b-v1:0", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "type": "chat" + }, + { + "id": "au.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (AU)", + "display_name": "Claude Opus 4.8 (AU)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": false @@ -126119,52 +128481,52 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1-Codex-Mini", - "display_name": "GPT-5.1-Codex-Mini", + "id": "anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 100000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -126176,143 +128538,183 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini", - "display_name": "GPT-4.1 Mini", + "id": "openai.gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-5-chat", - "name": "GPT-5 Chat (latest)", - "display_name": "GPT-5 Chat (latest)", + "id": "global.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (Global)", + "display_name": "Claude Sonnet 4.6 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "eu.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (EU)", + "display_name": "Claude Opus 4.7 (EU)", "modalities": { "input": [ "text", @@ -126324,144 +128726,146 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ + "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o Mini", - "display_name": "GPT-4o Mini", + "id": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (EU)", + "display_name": "Claude Sonnet 4.5 (EU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "mistral.ministral-3-14b-instruct", + "name": "Ministral 14B 3.0", + "display_name": "Ministral 14B 3.0", "modalities": { "input": [ - "text", - "audio", - "image", - "video" + "text" ], "output": [ - "text", - "audio", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "openai/gpt-5.1-chat", - "name": "GPT-5.1 Chat", - "display_name": "GPT-5.1 Chat", + "id": "us.anthropic.claude-opus-5", + "name": "Claude Opus 5 (US)", + "display_name": "Claude Opus 5 (US)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -126469,66 +128873,73 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-5-codex", - "name": "GPT-5 Codex", - "display_name": "GPT-5 Codex", + "id": "anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "global.anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6 (Global)", + "display_name": "Claude Opus 4.6 (Global)", "modalities": { "input": [ "text", @@ -126540,10 +128951,10 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -126553,35 +128964,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.2-chat", - "name": "GPT-5.2 Chat", - "display_name": "GPT-5.2 Chat", + "id": "google.gemma-3-12b-it", + "name": "Google Gemma 3 12B", + "display_name": "Google Gemma 3 12B", "modalities": { "input": [ "text", @@ -126592,89 +129009,69 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2-Codex", - "display_name": "GPT-5.2-Codex", + "id": "eu.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (EU)", + "display_name": "Claude Sonnet 5 (EU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "global.anthropic.claude-opus-5", + "name": "Claude Opus 5 (Global)", + "display_name": "Claude Opus 5 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -126682,187 +129079,130 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "minimax.minimax-m2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 196608, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3-Codex", - "display_name": "GPT-5.3-Codex", + "id": "mistral.ministral-3-3b-instruct", + "name": "Ministral 3 3B", + "display_name": "Ministral 3 3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5-image", - "name": "GPT-5 Image", - "display_name": "GPT-5 Image", + "id": "eu.anthropic.claude-opus-5", + "name": "Claude Opus 5 (EU)", + "display_name": "Claude Opus 5 (EU)", "modalities": { "input": [ "text", @@ -126870,15 +129210,14 @@ "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -126886,27 +129225,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-10-14", - "last_updated": "2025-10-14", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5 (Global)", + "display_name": "Claude Opus 4.5 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -126918,48 +129258,55 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1-Codex", - "display_name": "GPT-5.1-Codex", + "id": "anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -126970,112 +129317,98 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "google.gemma-3-27b-it", + "name": "Google Gemma 3 27B Instruct", + "display_name": "Google Gemma 3 27B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4000 + "context": 202752, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-27", + "last_updated": "2025-07-27", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "anthropic.claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4 Mini", - "display_name": "o4 Mini", + "id": "xai.grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -127086,8 +129419,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -127095,31 +129428,501 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-06-28", + "type": "chat" + }, + { + "id": "us.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (US)", + "display_name": "Claude Opus 4.8 (US)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1-Codex-Max", - "display_name": "GPT-5.1-Codex-Max", + "id": "deepseek.v3-v1:0", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 81920 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "type": "chat" + }, + { + "id": "qwen.qwen3-235b-a22b-2507-v1:0", + "name": "Qwen3 235B A22B 2507", + "display_name": "Qwen3 235B A22B 2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "type": "chat" + }, + { + "id": "us.anthropic.claude-fable-5", + "name": "Claude Fable 5 (US)", + "display_name": "Claude Fable 5 (US)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", + "type": "chat" + }, + { + "id": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5 (US)", + "display_name": "Claude Opus 4.5 (US)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", + "type": "chat" + }, + { + "id": "nvidia.nemotron-nano-3-30b", + "name": "NVIDIA Nemotron Nano 3 30B", + "display_name": "NVIDIA Nemotron Nano 3 30B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "type": "chat" + }, + { + "id": "global.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (Global)", + "display_name": "Claude Opus 4.7 (Global)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "au.anthropic.claude-opus-4-6-v1", + "name": "AU Anthropic Claude Opus 4.6", + "display_name": "AU Anthropic Claude Opus 4.6", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", + "type": "chat" + }, + { + "id": "eu.anthropic.claude-fable-5", + "name": "Claude Fable 5 (EU)", + "display_name": "Claude Fable 5 (EU)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", + "type": "chat" + }, + { + "id": "qwen.qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-06", + "last_updated": "2026-02-06", + "type": "chat" + }, + { + "id": "openai.gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", + "type": "chat" + }, + { + "id": "qwen.qwen3-vl-235b-a22b", + "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "display_name": "Qwen/Qwen3-VL-235B-A22B-Instruct", "modalities": { "input": [ "text", @@ -127130,11 +129933,351 @@ ] }, "limit": { - "context": 400000, + "context": 262000, + "output": 262000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "type": "chat" + }, + { + "id": "writer.palmyra-x5-v1:0", + "name": "Palmyra X5", + "display_name": "Palmyra X5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1040000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", + "type": "chat" + }, + { + "id": "amazon.nova-lite-v1:0", + "name": "Nova Lite", + "display_name": "Nova Lite", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 300000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "anthropic.claude-opus-4-1-20250805-v1:0", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + }, + { + "id": "minimax.minimax-m2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "type": "chat" + }, + { + "id": "openai.gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 272000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-06-01", + "type": "chat" + }, + { + "id": "meta.llama4-maverick-17b-instruct-v1:0", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" + }, + { + "id": "au.anthropic.claude-opus-5", + "name": "Claude Opus 5 (AU)", + "display_name": "Claude Opus 5 (AU)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, "output": 128000 }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", + "type": "chat" + }, + { + "id": "amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite", + "display_name": "Nova 2 Lite", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-12-01", + "last_updated": "2024-12-01", + "type": "chat" + }, + { + "id": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "name": "Claude Opus 4.1 (US)", + "display_name": "Claude Opus 4.1 (US)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + }, + { + "id": "jp.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (JP)", + "display_name": "Claude Opus 4.7 (JP)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": false @@ -127144,42 +130287,1133 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "eu.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (EU)", + "display_name": "Claude Sonnet 4.6 (EU)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", + "type": "chat" + }, + { + "id": "mistral.pixtral-large-2502-v1:0", + "name": "Pixtral Large (25.02)", + "display_name": "Pixtral Large (25.02)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-04-08", + "last_updated": "2025-04-08", + "type": "chat" + }, + { + "id": "openai.gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + } + ] + }, + "xiaomi-token-plan-ams": { + "id": "xiaomi-token-plan-ams", + "name": "Xiaomi Token Plan (Europe)", + "display_name": "Xiaomi Token Plan (Europe)", + "api": "https://token-plan-ams.xiaomimimo.com/v1", + "doc": "https://platform.xiaomimimo.com/#/docs", + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "mimo-v2.5-tts-voiceclone", + "name": "MiMo-V2.5-TTS-VoiceClone", + "display_name": "MiMo-V2.5-TTS-VoiceClone", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "mimo-v2.5-tts-voicedesign", + "name": "MiMo-V2.5-TTS-VoiceDesign", + "display_name": "MiMo-V2.5-TTS-VoiceDesign", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "mimo-v2-pro", + "name": "MiMo-V2-Pro", + "display_name": "MiMo-V2-Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "mimo-v2-tts", + "name": "MiMo-V2-TTS", + "display_name": "MiMo-V2-TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "mimo-v2.5-tts", + "name": "MiMo-V2.5-TTS", + "display_name": "MiMo-V2.5-TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + } + ] + }, + "minimax": { + "id": "minimax", + "name": "MiniMax (minimax.io)", + "display_name": "MiniMax (minimax.io)", + "api": "https://api.minimax.io/anthropic/v1", + "doc": "https://platform.minimax.io/docs/guides/quickstart", + "models": [ + { + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 196608, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "type": "chat" + }, + { + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "type": "chat" + }, + { + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", + "type": "chat" + }, + { + "id": "MiniMax-M2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", + "type": "chat" + }, + { + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-25", + "type": "chat" + } + ] + }, + "groq": { + "id": "groq", + "name": "Groq", + "display_name": "Groq", + "doc": "https://console.groq.com/docs/models", + "models": [ + { + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "llama-3.1-8b-instant", + "name": "Llama 3.1 8B", + "display_name": "Llama 3.1 8B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "whisper-large-v3", + "name": "Whisper", + "display_name": "Whisper", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2023-09-01", + "last_updated": "2025-09-05", + "type": "chat" + }, + { + "id": "allam-2-7b", + "name": "ALLaM-2-7b", + "display_name": "ALLaM-2-7b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 4096, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-01-23", + "last_updated": "2025-01-23", + "type": "chat" + }, + { + "id": "whisper-large-v3-turbo", + "name": "Whisper Large V3 Turbo", + "display_name": "Whisper Large V3 Turbo", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-10-01", + "last_updated": "2024-10-01", + "type": "chat" + }, + { + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "canopylabs/orpheus-arabic-saudi", + "name": "Canopy Labs Orpheus Arabic Saudi", + "display_name": "Canopy Labs Orpheus Arabic Saudi", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 4000, + "output": 50000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "type": "chat" + }, + { + "id": "canopylabs/orpheus-v1-english", + "name": "Canopy Labs Orpheus V1 English", + "display_name": "Canopy Labs Orpheus V1 English", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 4000, + "output": 50000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-12-19", + "last_updated": "2025-12-19", + "type": "chat" + }, + { + "id": "groq/compound-mini", + "name": "Compound Mini", + "display_name": "Compound Mini", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-09-04", + "last_updated": "2025-09-04", + "type": "chat" + }, + { + "id": "groq/compound", + "name": "Compound", + "display_name": "Compound", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-09-04", + "last_updated": "2025-09-04", + "type": "chat" + }, + { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-09-25", + "type": "chat" + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "Safety GPT OSS 20B", + "display_name": "Safety GPT OSS 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2026-06-29", + "type": "chat" + }, + { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-10-21", + "type": "chat" + }, + { + "id": "meta-llama/llama-prompt-guard-2-22m", + "name": "Llama Prompt Guard 2 22M", + "display_name": "Llama Prompt Guard 2 22M", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 512 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-05-29", + "last_updated": "2025-05-29", + "type": "chat" + }, + { + "id": "meta-llama/llama-prompt-guard-2-86m", + "name": "Prompt Guard 2 86M", + "display_name": "Prompt Guard 2 86M", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 512 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-05-29", + "last_updated": "2025-05-29", + "type": "chat" + } + ] + }, + "deepseek": { + "id": "deepseek", + "name": "DeepSeek", + "display_name": "DeepSeek", + "api": "https://api.deepseek.com", + "doc": "https://api-docs.deepseek.com/quick_start/pricing", + "models": [ + { + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" - } - ] - }, - "tensorx": { - "id": "tensorx", - "name": "TensorX", - "display_name": "TensorX", - "api": "https://api.tensorx.ai/v1", - "doc": "https://docs.tensorx.ai/", - "models": [ + }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -127189,8 +131423,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -127200,19 +131434,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ "text" @@ -127222,38 +131463,36 @@ ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -127274,77 +131513,103 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" - }, + } + ] + }, + "kimi-for-coding": { + "id": "kimi-for-coding", + "name": "Kimi For Coding", + "display_name": "Kimi For Coding", + "api": "https://api.kimi.com/coding/v1", + "doc": "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", + "models": [ { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B-A22B Instruct", - "display_name": "Qwen3 VL 235B-A22B Instruct", + "id": "k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131000, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-2507", - "name": "Qwen3 235B-A22B-2507", - "display_name": "Qwen3 235B-A22B-2507", + "id": "kimi-for-coding", + "name": "K2.7 Code", + "display_name": "K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 262144 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06-30", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-01", + "release_date": "2026-04", + "last_updated": "2026-04", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "kimi-for-coding-highspeed", + "name": "Kimi For Coding HighSpeed", + "display_name": "Kimi For Coding HighSpeed", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" @@ -127352,81 +131617,67 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "k3-256k", + "name": "Kimi K3-256K", + "display_name": "Kimi K3-256K", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -127436,30 +131687,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-01", + "release_date": "2026-04", + "last_updated": "2026-04", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -127470,6 +131732,8 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "fixed", "interleaved": true, "summaries": true, "visibility": "summary", @@ -127480,106 +131744,150 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-01", + "release_date": "2026-04", + "last_updated": "2026-04", "type": "chat" - }, + } + ] + }, + "requesty": { + "id": "requesty", + "name": "Requesty", + "display_name": "Requesty", + "api": "https://router.requesty.ai/v1", + "doc": "https://requesty.ai/solution/llm-routing/models", + "models": [ { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek R1-0528", - "display_name": "DeepSeek R1-0528", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -127592,59 +131900,91 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "deepseek/deepseek-chat-v3.1", - "name": "DeepSeek Chat V3.1", - "display_name": "DeepSeek Chat V3.1", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 163840 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -127653,55 +131993,95 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "z-ai/glm-5.2", + "id": "glm-5.2", "name": "GLM-5.2", "display_name": "GLM-5.2", "modalities": { @@ -127734,13 +132114,14 @@ "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -127748,82 +132129,108 @@ }, "limit": { "context": 200000, - "output": 200000 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 202752, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -127832,31 +132239,39 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -127865,38 +132280,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -127910,16 +132332,15 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -127931,7 +132352,7 @@ ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 262144 }, "temperature": false, @@ -127947,172 +132368,210 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - } - ] - }, - "llama": { - "id": "llama", - "name": "Llama", - "display_name": "Llama", - "api": "https://api.llama.com/compat/v1/", - "doc": "https://llama.developer.meta.com/docs/models", - "models": [ - { - "id": "cerebras-llama-4-maverick-17b-128e-instruct", - "name": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", - "display_name": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "cerebras-llama-4-scout-17b-16e-instruct", - "name": "Cerebras-Llama-4-Scout-17B-16E-Instruct", - "display_name": "Cerebras-Llama-4-Scout-17B-16E-Instruct", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "llama-4-scout-17b-16e-instruct-fp8", - "name": "Llama-4-Scout-17B-16E-Instruct-FP8", - "display_name": "Llama-4-Scout-17B-16E-Instruct-FP8", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", - "display_name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" - }, + } + ] + }, + "tensorx": { + "id": "tensorx", + "name": "TensorX", + "display_name": "TensorX", + "api": "https://api.tensorx.ai/v1", + "doc": "https://docs.tensorx.ai/", + "models": [ { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -128122,25 +132581,30 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "llama-3.3-8b-instruct", - "name": "Llama-3.3-8B-Instruct", - "display_name": "Llama-3.3-8B-Instruct", + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -128150,116 +132614,95 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "groq-llama-4-maverick-17b-128e-instruct", - "name": "Groq-Llama-4-Maverick-17B-128E-Instruct", - "display_name": "Groq-Llama-4-Maverick-17B-128E-Instruct", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "type": "chat" - } - ] - }, - "kilo": { - "id": "kilo", - "name": "Kilo Gateway", - "display_name": "Kilo Gateway", - "api": "https://api.kilo.ai/api/gateway", - "doc": "https://kilo.ai", - "models": [ - { - "id": "microsoft/phi-4-mini-instruct", - "name": "Microsoft: Phi 4 Mini Instruct", - "display_name": "Microsoft: Phi 4 Mini Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 128000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-10-17", - "last_updated": "2026-05-07", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "microsoft/phi-4", - "name": "Microsoft: Phi 4", - "display_name": "Microsoft: Phi 4", + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B-A22B Instruct", + "display_name": "Qwen3 VL 235B-A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 131000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "microsoft/wizardlm-2-8x22b", - "name": "WizardLM-2 8x22B", - "display_name": "WizardLM-2 8x22B", + "id": "qwen/qwen3-235b-a22b-2507", + "name": "Qwen3 235B-A22B-2507", + "display_name": "Qwen3 235B-A22B-2507", "modalities": { "input": [ "text" @@ -128269,78 +132712,102 @@ ] }, "limit": { - "context": 65535, - "output": 8000 + "context": 131000, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-04-24", - "last_updated": "2024-04-24", + "knowledge": "2025-06-30", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "cohere/command-r-08-2024", - "name": "Cohere: Command R (08-2024)", - "display_name": "Cohere: Command R (08-2024)", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "cohere/command-a", - "name": "Cohere: Command A", - "display_name": "Cohere: Command A", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Cohere: Command R+ (08-2024)", - "display_name": "Cohere: Command R+ (08-2024)", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -128350,24 +132817,30 @@ ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 196608, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "cohere/command-r7b-12-2024", - "name": "Cohere: Command R7B (12-2024)", - "display_name": "Cohere: Command R7B (12-2024)", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -128377,24 +132850,37 @@ ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-12-02", - "last_updated": "2024-12-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "NVIDIA: Nemotron 3 Nano 30B A3B", - "display_name": "NVIDIA: Nemotron 3 Nano 30B A3B", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -128404,8 +132890,8 @@ ] }, "limit": { - "context": 262144, - "output": 52429 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -128415,19 +132901,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2024-12", - "last_updated": "2026-02-04", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "nvidia/llama-3.3-nemotron-super-49b-v1.5", - "name": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", - "display_name": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1-0528", + "display_name": "DeepSeek R1-0528", "modalities": { "input": [ "text" @@ -128437,8 +132930,8 @@ ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -128446,16 +132939,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2025-03-16", - "last_updated": "2025-03-16", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "NVIDIA: Nemotron 3 Super", - "display_name": "NVIDIA: Nemotron 3 Super", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -128465,8 +132970,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -128481,28 +132986,26 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-04-11", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", - "name": "NVIDIA: Nemotron 3 Nano Omni (free)", - "display_name": "NVIDIA: Nemotron 3 Nano Omni (free)", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "audio", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -128510,16 +133013,22 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-05-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b:free", - "name": "NVIDIA: Nemotron 3 Super (free)", - "display_name": "NVIDIA: Nemotron 3 Super (free)", + "id": "deepseek/deepseek-chat-v3.1", + "name": "DeepSeek Chat V3.1", + "display_name": "DeepSeek Chat V3.1", "modalities": { "input": [ "text" @@ -128529,8 +133038,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 164000, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -128540,14 +133049,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-12", - "last_updated": "2026-03-15", + "knowledge": "2024-11", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "nvidia/nemotron-nano-9b-v2", - "name": "NVIDIA: Nemotron Nano 9B V2", - "display_name": "NVIDIA: Nemotron Nano 9B V2", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -128557,8 +133067,8 @@ ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -128568,19 +133078,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepcogito/cogito-v2.1-671b", - "name": "Deep Cogito: Cogito v2.1 671B", - "display_name": "Deep Cogito: Cogito v2.1 671B", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -128590,32 +133106,33 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 202752, + "output": 202752 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-11-14", - "last_updated": "2026-03-15", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "google/gemini-2.0-flash-lite-001", - "name": "Google: Gemini 2.0 Flash Lite", - "display_name": "Google: Gemini 2.0 Flash Lite", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" @@ -128623,67 +133140,41 @@ }, "limit": { "context": 1048576, - "output": 8192 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2024-12-11", - "last_updated": "2026-03-15", - "type": "chat" - }, - { - "id": "google/lyria-3-pro-preview", - "name": "Google: Lyria 3 Pro Preview", - "display_name": "Google: Lyria 3 Pro Preview", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "audio", - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-04-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Google: Gemini 3.5 Flash", - "display_name": "Google: Gemini 3.5 Flash", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "audio", - "image", - "pdf", "text", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, @@ -128694,47 +133185,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-19", - "last_updated": "2026-05-27", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "display_name": "Google: Gemini 2.5 Flash", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -128744,78 +133224,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-07-17", - "last_updated": "2026-03-15", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "display_name": "Google: Gemma 3 4B", + "id": "z-ai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ + "text", "image", - "text" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 19200 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-13", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "google/gemini-2.5-pro-preview", - "name": "Google: Gemini 2.5 Pro Preview 06-05", - "display_name": "Google: Gemini 2.5 Pro Preview 06-05", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "audio", + "text", "image", - "pdf", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -128824,114 +133291,101 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2026-03-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "google/lyria-3-clip-preview", - "name": "Google: Lyria 3 Clip Preview", - "display_name": "Google: Lyria 3 Clip Preview", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ - "audio", "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-04-11", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemini-3-pro-image-preview", - "name": "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", - "display_name": "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ - "image", "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-20", - "last_updated": "2026-03-15", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Google: Gemini 3.1 Flash Lite Preview", - "display_name": "Google: Gemini 3.1 Flash Lite Preview", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "audio", - "image", - "pdf", "text", + "image", "video" ], "output": [ @@ -128940,9 +133394,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -128954,30 +133408,26 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-15", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Google: Gemini 3 Flash Preview", - "display_name": "Google: Gemini 3 Flash Preview", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -128987,97 +133437,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-17", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "llama": { + "id": "llama", + "name": "Llama", + "display_name": "Llama", + "api": "https://api.llama.com/compat/v1/", + "doc": "https://llama.developer.meta.com/docs/models", + "models": [ { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Google: Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Google: Gemini 3.1 Pro Preview Custom Tools", + "id": "cerebras-llama-4-maverick-17b-128e-instruct", + "name": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", + "display_name": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "google/gemini-2.0-flash-001", - "name": "Google: Gemini 2.0 Flash", - "display_name": "Google: Gemini 2.0 Flash", + "id": "cerebras-llama-4-scout-17b-16e-instruct", + "name": "Cerebras-Llama-4-Scout-17B-16E-Instruct", + "display_name": "Cerebras-Llama-4-Scout-17B-16E-Instruct", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -129085,85 +133506,74 @@ "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2024-12-11", - "last_updated": "2026-03-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "google/gemini-3.1-flash-image-preview", - "name": "Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)", - "display_name": "Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)", + "id": "llama-4-scout-17b-16e-instruct-fp8", + "name": "Llama-4-Scout-17B-16E-Instruct-FP8", + "display_name": "Llama-4-Scout-17B-16E-Instruct-FP8", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ - "image", "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Google: Gemma 4 26B A4B", - "display_name": "Google: Gemma 4 26B A4B", + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "display_name": "Llama-4-Maverick-17B-128E-Instruct-FP8", "modalities": { "input": [ - "image", "text", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-03", - "last_updated": "2026-04-11", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "display_name": "Google: Gemma 2 27B", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -129173,27 +133583,27 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-06-24", - "last_updated": "2024-06-24", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "display_name": "Google: Gemma 3 27B", + "id": "llama-3.3-8b-instruct", + "name": "Llama-3.3-8B-Instruct", + "display_name": "Llama-3.3-8B-Instruct", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -129202,7 +133612,7 @@ }, "limit": { "context": 128000, - "output": 65536 + "output": 4096 }, "temperature": true, "tool_call": true, @@ -129211,105 +133621,81 @@ }, "attachment": true, "open_weights": true, - "release_date": "2025-03-12", - "last_updated": "2026-03-15", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Google: Gemini 3.1 Flash Lite", - "display_name": "Google: Gemini 3.1 Flash Lite", + "id": "groq-llama-4-maverick-17b-128e-instruct", + "name": "Groq-Llama-4-Maverick-17B-128E-Instruct", + "display_name": "Groq-Llama-4-Maverick-17B-128E-Instruct", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-07", - "last_updated": "2026-05-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" - }, + } + ] + }, + "kilo": { + "id": "kilo", + "name": "Kilo Gateway", + "display_name": "Kilo Gateway", + "api": "https://api.kilo.ai/api/gateway", + "doc": "https://kilo.ai", + "models": [ { - "id": "google/gemini-2.5-pro-preview-05-06", - "name": "Google: Gemini 2.5 Pro Preview 05-06", - "display_name": "Google: Gemini 2.5 Pro Preview 05-06", + "id": "microsoft/phi-4", + "name": "Microsoft: Phi 4", + "display_name": "Microsoft: Phi 4", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-06", - "last_updated": "2026-03-15", + "release_date": "2025-01-10", + "last_updated": "2025-01-10", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "display_name": "Google: Gemma 3 12B", + "id": "microsoft/wizardlm-2-8x22b", + "name": "WizardLM-2 8x22B", + "display_name": "WizardLM-2 8x22B", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -129317,88 +133703,79 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 65535, + "output": 8000 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-03-13", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": false, + "release_date": "2024-04-16", + "last_updated": "2024-04-16", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Google: Gemma 4 31B", - "display_name": "Google: Gemma 4 31B", + "id": "cohere/command-r-08-2024", + "name": "Command R", + "display_name": "Command R", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-11", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Nano Banana (Gemini 2.5 Flash Image)", - "display_name": "Google: Nano Banana (Gemini 2.5 Flash Image)", + "id": "cohere/command-a", + "name": "Cohere: Command A", + "display_name": "Cohere: Command A", "modalities": { "input": [ - "image", "text" ], "output": [ - "image", "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-10-08", - "last_updated": "2026-03-15", - "type": "imageGeneration" + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "type": "chat" }, { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "display_name": "Google: Gemma 3n 4B", + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+", + "display_name": "Command R+", "modalities": { "input": [ "text" @@ -129408,138 +133785,91 @@ ] }, "limit": { - "context": 32768, - "output": 6554 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite-preview-09-2025", - "name": "Google: Gemini 2.5 Flash Lite Preview 09-2025", - "display_name": "Google: Gemini 2.5 Flash Lite Preview 09-2025", + "id": "cohere/command-r7b-12-2024", + "name": "Command R7B", + "display_name": "Command R7B", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-12-02", + "last_updated": "2024-12-02", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Google: Gemini 3.1 Pro Preview", - "display_name": "Google: Gemini 3.1 Pro Preview", + "id": "cohere/north-mini-code:free", + "name": "Cohere: North Mini Code (free)", + "display_name": "Cohere: North Mini Code (free)", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "context": 256000, + "output": 64000 }, - "attachment": true, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "release_date": "2026-02-19", - "last_updated": "2026-03-15", + "release_date": "2026-06-17", + "last_updated": "2026-06-17", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "display_name": "Google: Gemini 2.5 Pro", + "id": "nvidia/nemotron-3-ultra-550b-a55b:free", + "name": "NVIDIA: Nemotron 3 Ultra (free)", + "display_name": "NVIDIA: Nemotron 3 Ultra (free)", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -129548,86 +133878,49 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "display_name": "Google: Gemini 2.5 Flash Lite", + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-17", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "relace/relace-apply-3", - "name": "Relace: Relace Apply 3", - "display_name": "Relace: Relace Apply 3", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -129637,26 +133930,36 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-26", - "last_updated": "2026-03-15", + "open_weights": true, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "relace/relace-search", - "name": "Relace: Relace Search", - "display_name": "Relace: Relace Search", + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "name": "NVIDIA: Nemotron 3 Nano Omni (free)", + "display_name": "NVIDIA: Nemotron 3 Nano Omni (free)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -129664,35 +133967,35 @@ }, "limit": { "context": 256000, - "output": 128000 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-09", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "perceptron/perceptron-mk1", - "name": "Perceptron: Perceptron Mk1", - "display_name": "Perceptron: Perceptron Mk1", + "id": "nvidia/nemotron-3.5-content-safety:free", + "name": "NVIDIA: Nemotron 3.5 Content Safety (free)", + "display_name": "NVIDIA: Nemotron 3.5 Content Safety (free)", "modalities": { "input": [ - "image", "text", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 128000, "output": 8192 }, "temperature": true, @@ -129702,28 +134005,26 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-16", + "open_weights": true, + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "qwen/qwen3.5-flash-02-23", - "name": "Qwen: Qwen3.5-Flash", - "display_name": "Qwen: Qwen3.5-Flash", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 512288, + "output": 512288 }, "temperature": true, "tool_call": true, @@ -129733,25 +134034,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen: Qwen3 32B", - "display_name": "Qwen: Qwen3 32B", + "id": "nvidia/nemotron-3-super-120b-a12b:free", + "name": "NVIDIA: Nemotron 3 Super (free)", + "display_name": "NVIDIA: Nemotron 3 Super (free)", "modalities": { "input": [ "text" @@ -129761,8 +134056,8 @@ ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -129770,40 +134065,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2024-12-01", - "last_updated": "2026-02-04", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen: Qwen3.6 35B A3B", - "display_name": "Qwen: Qwen3.6 35B A3B", + "id": "deepcogito/cogito-v2.1-671b", + "name": "Deep Cogito: Cogito v2.1 671B", + "display_name": "Deep Cogito: Cogito v2.1 671B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": false, @@ -129811,77 +134093,60 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-05-01", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b", - "name": "Qwen: Qwen3 30B A3B", - "display_name": "Qwen: Qwen3 30B A3B", + "id": "google/lyria-3-pro-preview", + "name": "Lyria 3 Pro Preview", + "display_name": "Lyria 3 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-thinking-2507", - "name": "Qwen: Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen: Qwen3 235B A22B Thinking 2507", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -129892,36 +134157,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/qwen3-vl-30b-a3b-thinking", - "name": "Qwen: Qwen3 VL 30B A3B Thinking", - "display_name": "Qwen: Qwen3 VL 30B A3B Thinking", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ + "text", "image", - "text" + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -129932,63 +134209,76 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-11", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen3-coder-30b-a3b-instruct", - "name": "Qwen: Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen: Qwen3 Coder 30B A3B Instruct", + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "display_name": "Google: Gemma 3 4B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 160000, - "output": 32768 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen/qwen3.5-plus-02-15", - "name": "Qwen: Qwen3.5 Plus 2026-02-15", - "display_name": "Qwen: Qwen3.5 Plus 2026-02-15", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "image", "text", - "video" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -129999,37 +134289,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-15", - "last_updated": "2026-03-15", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen: Qwen3.5-27B", - "display_name": "Qwen: Qwen3.5-27B", + "id": "google/gemini-2.5-pro-preview", + "name": "Google: Gemini 2.5 Pro Preview 06-05", + "display_name": "Google: Gemini 2.5 Pro Preview 06-05", "modalities": { "input": [ + "pdf", "image", "text", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -130041,71 +134327,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen: Qwen3.7 Max", - "display_name": "Qwen: Qwen3.7 Max", + "id": "google/lyria-3-clip-preview", + "name": "Lyria 3 Clip Preview", + "display_name": "Lyria 3 Clip Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2026-05-27", + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen: Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen: Qwen3 Next 80B A3B Thinking", + "id": "google/gemini-3-pro-image-preview", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 131072, + "context": 65536, "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -130113,37 +134406,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-11", - "last_updated": "2026-03-15", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "type": "imageGeneration" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen: Qwen3.5-9B", - "display_name": "Qwen: Qwen3.5-9B", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "image", "text", - "video" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -130153,38 +134455,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-10", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen: Qwen3.6 27B", - "display_name": "Qwen: Qwen3.6 27B", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -130195,36 +134494,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-05-01", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen: Qwen3.5-35B-A3B", - "display_name": "Qwen: Qwen3.5-35B-A3B", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ - "image", "text", - "video" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -130236,101 +134546,118 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen/qwen-2.5-7b-instruct", - "name": "Qwen: Qwen2.5 7B Instruct", - "display_name": "Qwen: Qwen2.5 7B Instruct", + "id": "google/gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 32768, - "output": 6554 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09", - "last_updated": "2025-04-16", - "type": "chat" + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "imageGeneration" }, { - "id": "qwen/qwen3-14b", - "name": "Qwen: Qwen3 14B", - "display_name": "Qwen: Qwen3 14B", + "id": "google/gemini-3.1-flash-image-preview", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04", - "last_updated": "2026-03-15", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "imageGeneration" }, { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen: Qwen3 235B A22B", - "display_name": "Qwen: Qwen3 235B A22B", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "image", + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -130340,25 +134667,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-12-01", - "last_updated": "2026-03-15", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen: Qwen3 Max", - "display_name": "Qwen: Qwen3 Max", + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "display_name": "Google: Gemma 2 27B", "modalities": { "input": [ "text" @@ -130368,39 +134689,28 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 8192, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-05", - "last_updated": "2026-03-15", + "release_date": "2024-07-13", + "last_updated": "2024-07-13", "type": "chat" }, { - "id": "qwen/qwen3-vl-8b-instruct", - "name": "Qwen: Qwen3 VL 8B Instruct", - "display_name": "Qwen: Qwen3 VL 8B Instruct", + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "display_name": "Google: Gemma 3 27B", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ "text" @@ -130408,7 +134718,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -130416,26 +134726,30 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-15", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "qwen/qwen3-8b", - "name": "Qwen: Qwen3 8B", - "display_name": "Qwen: Qwen3 8B", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -130446,82 +134760,155 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen: Qwen3 Coder Plus", - "display_name": "Qwen: Qwen3 Coder Plus", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-01", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen: Qwen3 Coder Flash", - "display_name": "Qwen: Qwen3 Coder Flash", + "id": "google/gemini-2.5-pro-preview-05-06", + "name": "Google: Gemini 2.5 Pro Preview 05-06", + "display_name": "Google: Gemini 2.5 Pro Preview 05-06", "modalities": { "input": [ + "text", + "image", + "pdf", + "audio", + "video" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65535 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-07", + "last_updated": "2025-05-07", + "type": "chat" + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "display_name": "Google: Gemma 3 12B", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-07-23", - "last_updated": "2026-03-15", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen: Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen: Qwen3 VL 235B A22B Instruct", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ + "image", "text", - "image" + "video" ], "output": [ "text" @@ -130529,30 +134916,38 @@ }, "limit": { "context": 262144, - "output": 52429 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-09-23", - "last_updated": "2026-01-10", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3-vl-32b-instruct", - "name": "Qwen: Qwen3 VL 32B Instruct", - "display_name": "Qwen: Qwen3 VL 32B Instruct", + "id": "google/gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { @@ -130560,47 +134955,58 @@ "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "Qwen2.5 72B Instruct", - "display_name": "Qwen2.5 72B Instruct", + "id": "google/gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 32768, - "output": 16384 + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09", - "last_updated": "2026-01-10", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "imageGeneration" }, { - "id": "qwen/qwen-plus-2025-07-28:thinking", - "name": "Qwen: Qwen Plus 0728 (thinking)", - "display_name": "Qwen: Qwen Plus 0728 (thinking)", + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "display_name": "Google: Gemma 3n 4B", "modalities": { "input": [ "text" @@ -130610,74 +135016,88 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 32768, + "output": 6554 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-09-09", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen: Qwen-Plus", - "display_name": "Qwen: Qwen-Plus", + "id": "google/gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, + "context": 65536, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2025-09-11", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "qwen/qwen3-30b-a3b-thinking-2507", - "name": "Qwen: Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen: Qwen3 30B A3B Thinking 2507", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 6554 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -130688,36 +135108,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen/qwen3-vl-8b-thinking", - "name": "Qwen: Qwen3 VL 8B Thinking", - "display_name": "Qwen: Qwen3 VL 8B Thinking", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ + "text", "image", - "text" + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -130728,188 +135158,172 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-11-25", - "type": "chat" - }, - { - "id": "qwen/qwen3-235b-a22b-2507", - "name": "Qwen: Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen: Qwen3 235B A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 52429 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04", - "last_updated": "2026-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen: Qwen3.6 Flash", - "display_name": "Qwen: Qwen3.6 Flash", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", "image", - "video" + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-05-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-instruct-2507", - "name": "Qwen: Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen: Qwen3 30B A3B Instruct 2507", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 524288, + "output": 524288 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-29", - "last_updated": "2026-03-15", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen: Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen: Qwen3 VL 30B A3B Instruct", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 524288, + "output": 524288 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "release_date": "2025-10-05", - "last_updated": "2025-11-25", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen: Qwen3.5 397B A17B", - "display_name": "Qwen: Qwen3.5 397B A17B", + "id": "relace/relace-apply-3", + "name": "Relace: Relace Apply 3", + "display_name": "Relace: Relace Apply 3", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-15", - "last_updated": "2026-03-15", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "qwen/qwen-2.5-coder-32b-instruct", - "name": "Qwen2.5 Coder 32B Instruct", - "display_name": "Qwen2.5 Coder 32B Instruct", + "id": "relace/relace-search", + "name": "Relace: Relace Search", + "display_name": "Relace: Relace Search", "modalities": { "input": [ "text" @@ -130919,114 +135333,96 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 256000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-11-11", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen: Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen: Qwen3 VL 235B A22B Thinking", + "id": "perceptron/perceptron-mk1", + "name": "Perceptron: Perceptron Mk1", + "display_name": "Perceptron: Perceptron Mk1", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2025-09-24", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen: Qwen3.6 Max Preview", - "display_name": "Qwen: Qwen3.6 Max Preview", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-05-01", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "qwen/qwen3-max-thinking", - "name": "Qwen: Qwen3 Max Thinking", - "display_name": "Qwen: Qwen3 Max Thinking", + "id": "qwen/qwen3.5-flash-02-23", + "name": "Qwen: Qwen3.5-Flash", + "display_name": "Qwen: Qwen3.5-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -131045,73 +135441,88 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-23", - "last_updated": "2026-03-15", + "release_date": "2026-02-25", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "qwen/qwen3-coder", - "name": "Qwen: Qwen3 Coder 480B A35B", - "display_name": "Qwen: Qwen3 Coder 480B A35B", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 52429 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "qwen/qwen3-coder-next", - "name": "Qwen: Qwen3 Coder Next", - "display_name": "Qwen: Qwen3 Coder Next", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-02", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen: Qwen3.6 Plus", - "display_name": "Qwen: Qwen3.6 Plus", + "id": "qwen/qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -131119,8 +135530,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -131139,20 +135550,21 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2026-04-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen: Qwen3.5-122B-A10B", - "display_name": "Qwen: Qwen3.5-122B-A10B", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "image", "text", + "image", "video" ], "output": [ @@ -131161,7 +135573,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -131182,27 +135594,25 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen/qwen3.5-plus-20260420", - "name": "Qwen: Qwen3.5 Plus 2026-04-20", - "display_name": "Qwen: Qwen3.5 Plus 2026-04-20", + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen: Qwen3 30B A3B", + "display_name": "Qwen: Qwen3 30B A3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -131221,16 +135631,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-05-01", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen/qwen-plus-2025-07-28", - "name": "Qwen: Qwen Plus 0728", - "display_name": "Qwen: Qwen Plus 0728", + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen: Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ "text" @@ -131240,13 +135650,14 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131072, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -131260,18 +135671,19 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2025-09-09", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen: Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen: Qwen3 Next 80B A3B Instruct", + "id": "qwen/qwen3-vl-30b-a3b-thinking", + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "display_name": "Qwen: Qwen3 VL 30B A3B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -131279,26 +135691,37 @@ }, "limit": { "context": 131072, - "output": 52429 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-11", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "qwen/qwen2.5-vl-72b-instruct", - "name": "Qwen: Qwen2.5 VL 72B Instruct", - "display_name": "Qwen: Qwen2.5 VL 72B Instruct", + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -131306,29 +135729,30 @@ ] }, "limit": { - "context": 32768, + "context": 160000, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-02-01", - "last_updated": "2026-03-15", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "stealth/claude-sonnet-4.6", - "name": "Stealth: Claude Sonnet 4.6 (20% off)", - "display_name": "Stealth: Claude Sonnet 4.6 (20% off)", + "id": "qwen/qwen3.5-plus-02-15", + "name": "Qwen: Qwen3.5 Plus 2026-02-15", + "display_name": "Qwen: Qwen3.5 Plus 2026-02-15", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "video" ], "output": [ "text" @@ -131336,112 +135760,78 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-17", - "last_updated": "2026-05-27", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "stealth/claude-opus-4.7", - "name": "Stealth: Claude Opus 4.7 (20% off)", - "display_name": "Stealth: Claude Opus 4.7 (20% off)", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-05-27", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "stealth/claude-opus-4.6", - "name": "Stealth: Claude Opus 4.6 (20% off)", - "display_name": "Stealth: Claude Opus 4.6 (20% off)", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -131450,52 +135840,29 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-05-27", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "inception/mercury-2", - "name": "Inception: Mercury 2", - "display_name": "Inception: Mercury 2", + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "display_name": "Qwen3-Next 80B-A3B (Thinking)", "modalities": { "input": [ "text" @@ -131506,7 +135873,7 @@ }, "limit": { "context": 128000, - "output": 50000 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -131514,20 +135881,32 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "rekaai/reka-edge", - "name": "Reka Edge", - "display_name": "Reka Edge", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "image", "text", + "image", "video" ], "output": [ @@ -131535,55 +135914,41 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-03-20", - "last_updated": "2026-04-11", - "type": "chat" - }, - { - "id": "rekaai/reka-flash-3", - "name": "Reka Flash 3", - "display_name": "Reka Flash 3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 65536 - }, - "temperature": true, - "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-03-12", - "last_updated": "2026-04-11", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "tencent/hunyuan-a13b-instruct", - "name": "Tencent: Hunyuan A13B Instruct", - "display_name": "Tencent: Hunyuan A13B Instruct", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -131594,24 +135959,37 @@ "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-11-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "tencent/hy3-preview", - "name": "Tencent: Hy3 Preview", - "display_name": "Tencent: Hy3 Preview", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -131629,19 +136007,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-05-16", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "upstage/solar-pro-3", - "name": "Upstage: Solar Pro 3", - "display_name": "Upstage: Solar Pro 3", + "id": "qwen/qwen-2.5-7b-instruct", + "name": "Qwen: Qwen2.5 7B Instruct", + "display_name": "Qwen: Qwen2.5 7B Instruct", "modalities": { "input": [ "text" @@ -131651,25 +136035,24 @@ ] }, "limit": { - "context": 128000, + "context": 32768, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-01-27", - "last_updated": "2026-03-15", + "release_date": "2024-10-16", + "last_updated": "2024-10-16", "type": "chat" }, { - "id": "prime-intellect/intellect-3", - "name": "Prime Intellect: INTELLECT-3", - "display_name": "Prime Intellect: INTELLECT-3", + "id": "qwen/qwen3-14b", + "name": "Qwen: Qwen3 14B", + "display_name": "Qwen: Qwen3 14B", "modalities": { "input": [ "text" @@ -131680,7 +136063,7 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -131688,16 +136071,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "release_date": "2025-11-26", - "last_updated": "2026-02-04", + "open_weights": false, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "mistralai/mistral-large", - "name": "Mistral Large", - "display_name": "Mistral Large", + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen3 235B-A22B", + "display_name": "Qwen3 235B-A22B", "modalities": { "input": [ "text" @@ -131707,27 +136101,39 @@ ] }, "limit": { - "context": 128000, - "output": 25600 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-07-24", - "last_updated": "2025-12-02", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "mistralai/ministral-8b-2512", - "name": "Mistral: Ministral 3 8B 2512", - "display_name": "Mistral: Ministral 3 8B 2512", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -131736,51 +136142,35 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2026-03-15", - "type": "chat" - }, - { - "id": "mistralai/ministral-14b-2512", - "name": "Mistral: Ministral 3 14B 2512", - "display_name": "Mistral: Ministral 3 14B 2512", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 52429 + "supported": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "mistralai/ministral-3b-2512", - "name": "Mistral: Ministral 3 3B 2512", - "display_name": "Mistral: Ministral 3 3B 2512", + "id": "qwen/qwen3-vl-8b-instruct", + "name": "Qwen: Qwen3 VL 8B Instruct", + "display_name": "Qwen: Qwen3 VL 8B Instruct", "modalities": { "input": [ "image", @@ -131800,42 +136190,15 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2026-03-15", - "type": "chat" - }, - { - "id": "mistralai/mistral-small-24b-instruct-2501", - "name": "Mistral: Mistral Small 3", - "display_name": "Mistral: Mistral Small 3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-29", - "last_updated": "2026-01-10", + "open_weights": false, + "release_date": "2025-10-14", + "last_updated": "2025-10-14", "type": "chat" }, { - "id": "mistralai/mistral-large-2411", - "name": "Mistral Large 2411", - "display_name": "Mistral Large 2411", + "id": "qwen/qwen3-8b", + "name": "Qwen: Qwen3 8B", + "display_name": "Qwen: Qwen3 8B", "modalities": { "input": [ "text" @@ -131846,23 +136209,35 @@ }, "limit": { "context": 131072, - "output": 26215 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-07-24", - "last_updated": "2024-11-04", + "open_weights": false, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "mistralai/mistral-large-2407", - "name": "Mistral Large 2407", - "display_name": "Mistral Large 2407", + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -131872,8 +136247,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -131881,46 +136256,53 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-11-19", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.1", - "name": "Mistral: Mistral Medium 3.1", - "display_name": "Mistral: Mistral Medium 3.1", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-12", - "last_updated": "2025-08-12", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "mistralai/pixtral-large-2411", - "name": "Mistral: Pixtral Large 2411", - "display_name": "Mistral: Pixtral Large 2411", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -131928,27 +136310,29 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2024-11-19", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "mistralai/mistral-nemo", - "name": "Mistral: Mistral Nemo", - "display_name": "Mistral: Mistral Nemo", + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen: Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen: Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -131956,33 +136340,34 @@ }, "limit": { "context": 131072, - "output": 16384 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-01", - "last_updated": "2024-07-30", + "attachment": true, + "open_weights": false, + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "mistralai/mistral-saba", - "name": "Mistral: Saba", - "display_name": "Mistral: Saba", + "id": "qwen/qwen3-vl-32b-instruct", + "name": "Qwen: Qwen3 VL 32B Instruct", + "display_name": "Qwen: Qwen3 VL 32B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 131072, "output": 32768 }, "temperature": true, @@ -131990,19 +136375,18 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-02-17", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-23", + "last_updated": "2025-10-23", "type": "chat" }, - { - "id": "mistralai/mistral-small-2603", - "name": "Mistral: Mistral Small 4", - "display_name": "Mistral: Mistral Small 4", + { + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "display_name": "Qwen2.5 72B Instruct", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -132010,25 +136394,24 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-03-16", - "last_updated": "2026-04-11", + "attachment": false, + "open_weights": false, + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "mistralai/codestral-2508", - "name": "Mistral: Codestral 2508", - "display_name": "Mistral: Codestral 2508", + "id": "qwen/qwen-plus-2025-07-28:thinking", + "name": "Qwen: Qwen Plus 0728 (thinking)", + "display_name": "Qwen: Qwen Plus 0728 (thinking)", "modalities": { "input": [ "text" @@ -132038,24 +136421,25 @@ ] }, "limit": { - "context": 256000, - "output": 51200 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-01", - "last_updated": "2025-08-01", + "open_weights": false, + "release_date": "2025-09-08", + "last_updated": "2025-09-08", "type": "chat" }, { - "id": "mistralai/mixtral-8x22b-instruct", - "name": "Mistral: Mixtral 8x22B Instruct", - "display_name": "Mistral: Mixtral 8x22B Instruct", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -132065,24 +136449,36 @@ ] }, "limit": { - "context": 65536, - "output": 13108 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "mistralai/mistral-7b-instruct-v0.1", - "name": "Mistral: Mistral 7B Instruct v0.1", - "display_name": "Mistral: Mistral 7B Instruct v0.1", + "id": "qwen/qwen3-30b-a3b-thinking-2507", + "name": "Qwen: Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen: Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ "text" @@ -132092,52 +136488,76 @@ ] }, "limit": { - "context": 2824, - "output": 565 + "context": 81920, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-04-03", - "last_updated": "2025-04-03", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "mistralai/voxtral-small-24b-2507", - "name": "Mistral: Voxtral Small 24B 2507", - "display_name": "Mistral: Voxtral Small 24B 2507", + "id": "qwen/qwen3-vl-8b-thinking", + "name": "Qwen: Qwen3 VL 8B Thinking", + "display_name": "Qwen: Qwen3 VL 8B Thinking", "modalities": { "input": [ - "text", - "audio" + "image", + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 6400 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-01", - "last_updated": "2025-07-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-14", + "last_updated": "2025-10-14", "type": "chat" }, { - "id": "mistralai/devstral-medium", - "name": "Mistral: Devstral Medium", - "display_name": "Mistral: Devstral Medium", + "id": "qwen/qwen3-235b-a22b-2507", + "name": "Qwen: Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen: Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -132148,7 +136568,7 @@ }, "limit": { "context": 131072, - "output": 26215 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -132156,43 +136576,56 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-10", - "last_updated": "2025-07-10", + "open_weights": false, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "mistralai/mistral-small-3.2-24b-instruct", - "name": "Mistral: Mistral Small 3.2 24B", - "display_name": "Mistral: Mistral Small 3.2 24B", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "mistralai/devstral-small", - "name": "Mistral: Devstral Small 1.1", - "display_name": "Mistral: Devstral Small 1.1", + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen: Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen: Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ "text" @@ -132202,8 +136635,8 @@ ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -132211,19 +136644,19 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-05-07", - "last_updated": "2025-07-10", + "open_weights": false, + "release_date": "2025-07-29", + "last_updated": "2025-07-29", "type": "chat" }, { - "id": "mistralai/mistral-medium-3-5", - "name": "Mistral: Mistral Medium 3.5", - "display_name": "Mistral: Mistral Medium 3.5", + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen: Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ "text" @@ -132231,27 +136664,28 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-05-07", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "mistralai/devstral-2512", - "name": "Mistral: Devstral 2 2512", - "display_name": "Mistral: Devstral 2 2512", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -132264,21 +136698,32 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-09-12", - "last_updated": "2026-03-15", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "mistralai/mistral-small-3.1-24b-instruct", - "name": "Mistral: Mistral Small 3.1 24B", - "display_name": "Mistral: Mistral Small 3.1 24B", + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "display_name": "Qwen2.5 Coder 32B Instruct", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -132286,24 +136731,24 @@ ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-03-17", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": false, + "release_date": "2024-11-11", + "last_updated": "2024-11-11", "type": "chat" }, { - "id": "mistralai/mistral-medium-3", - "name": "Mistral: Mistral Medium 3", - "display_name": "Mistral: Mistral Medium 3", + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen: Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen: Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ "text", @@ -132315,27 +136760,38 @@ }, "limit": { "context": 131072, - "output": 26215 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "mistralai/mistral-large-2512", - "name": "Mistral: Mistral Large 3 2512", - "display_name": "Mistral: Mistral Large 3 2512", + "id": "qwen/qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -132343,26 +136799,38 @@ }, "limit": { "context": 262144, - "output": 52429 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2024-11-01", - "last_updated": "2025-12-16", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "bytedance/ui-tars-1.5-7b", - "name": "ByteDance: UI-TARS 7B ", - "display_name": "ByteDance: UI-TARS 7B ", + "id": "qwen/qwen3-max-thinking", + "name": "Qwen: Qwen3 Max Thinking", + "display_name": "Qwen: Qwen3 Max Thinking", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -132370,24 +136838,36 @@ ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-07-23", - "last_updated": "2026-03-15", + "release_date": "2026-02-09", + "last_updated": "2026-02-09", "type": "chat" }, { - "id": "nex-agi/deepseek-v3.1-nex-n1", - "name": "Nex AGI: DeepSeek V3.1 Nex N1", - "display_name": "Nex AGI: DeepSeek V3.1 Nex N1", + "id": "qwen/qwen3-coder", + "name": "Qwen: Qwen3 Coder 480B A35B", + "display_name": "Qwen: Qwen3 Coder 480B A35B", "modalities": { "input": [ "text" @@ -132397,8 +136877,8 @@ ] }, "limit": { - "context": 131072, - "output": 163840 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -132407,14 +136887,14 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-11-25", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "thedrummer/rocinante-12b", - "name": "TheDrummer: Rocinante 12B", - "display_name": "TheDrummer: Rocinante 12B", + "id": "qwen/qwen3-coder-next", + "name": "Qwen: Qwen3 Coder Next", + "display_name": "Qwen: Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -132424,8 +136904,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -132433,96 +136913,139 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-09-30", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "thedrummer/unslopnemo-12b", - "name": "TheDrummer: UnslopNemo 12B", - "display_name": "TheDrummer: UnslopNemo 12B", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-11-09", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "thedrummer/cydonia-24b-v4.1", - "name": "TheDrummer: Cydonia 24B V4.1", - "display_name": "TheDrummer: Cydonia 24B V4.1", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-09-27", - "last_updated": "2026-03-15", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "thedrummer/skyfall-36b-v2", - "name": "TheDrummer: Skyfall 36B V2", - "display_name": "TheDrummer: Skyfall 36B V2", + "id": "qwen/qwen3.5-plus-20260420", + "name": "Qwen: Qwen3.5 Plus 2026-04-20", + "display_name": "Qwen: Qwen3.5 Plus 2026-04-20", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-11", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "alfredpros/codellama-7b-instruct-solidity", - "name": "AlfredPros: CodeLLaMa 7B Instruct Solidity", - "display_name": "AlfredPros: CodeLLaMa 7B Instruct Solidity", + "id": "qwen/qwen-plus-2025-07-28", + "name": "Qwen: Qwen Plus 0728", + "display_name": "Qwen: Qwen Plus 0728", "modalities": { "input": [ "text" @@ -132532,24 +137055,35 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 1000000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2025-04-14", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-09-08", + "last_updated": "2025-09-08", "type": "chat" }, { - "id": "undi95/remm-slerp-l2-13b", - "name": "ReMM SLERP 13B", - "display_name": "ReMM SLERP 13B", + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -132559,89 +137093,124 @@ ] }, "limit": { - "context": 6144, - "output": 4096 + "context": 262144, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2023-07-22", - "last_updated": "2026-03-15", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "gryphe/mythomax-l2-13b", - "name": "MythoMax 13B", - "display_name": "MythoMax 13B", + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen: Qwen2.5 VL 72B Instruct", + "display_name": "Qwen: Qwen2.5 VL 72B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 32000, + "output": 128000 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-04-25", - "last_updated": "2024-04-25", + "attachment": true, + "open_weights": false, + "release_date": "2025-02-01", + "last_updated": "2025-02-01", "type": "chat" }, { - "id": "essentialai/rnj-1-instruct", - "name": "EssentialAI: Rnj 1 Instruct", - "display_name": "EssentialAI: Rnj 1 Instruct", + "id": "stealth/claude-sonnet-4.6", + "name": "Stealth: Claude Sonnet 4.6 (20% off)", + "display_name": "Stealth: Claude Sonnet 4.6 (20% off)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 6554 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-05", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "inclusionai/ring-2.6-1t", - "name": "inclusionAI: Ring-2.6-1T", - "display_name": "inclusionAI: Ring-2.6-1T", + "id": "stealth/gpt-5.6-sol", + "name": "Stealth: GPT-5.6 Sol (20% off)", + "display_name": "Stealth: GPT-5.6 Sol (20% off)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -132649,125 +137218,249 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-08", - "last_updated": "2026-05-16", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "inclusionai/ling-2.6-1t", - "name": "inclusionAI: Ling-2.6-1T", - "display_name": "inclusionAI: Ling-2.6-1T", + "id": "stealth/claude-opus-4.7", + "name": "Stealth: Claude Opus 4.7 (20% off)", + "display_name": "Stealth: Claude Opus 4.7 (20% off)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-05-16", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "inclusionai/ling-2.6-flash", - "name": "inclusionAI: Ling-2.6 Flash", - "display_name": "inclusionAI: Ling-2.6 Flash", + "id": "stealth/claude-opus-4.8", + "name": "Stealth: Claude Opus 4.8 (20% off)", + "display_name": "Stealth: Claude Opus 4.8 (20% off)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-05-01", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "allenai/olmo-3-32b-think", - "name": "AllenAI: Olmo 3 32B Think", - "display_name": "AllenAI: Olmo 3 32B Think", + "id": "stealth/qwen3.6-plus", + "name": "Stealth: Qwen3.6 Plus (50% off)", + "display_name": "Stealth: Qwen3.6 Plus (50% off)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, + "context": 1000000, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-11-22", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "ai21/jamba-large-1.7", - "name": "AI21: Jamba Large 1.7", - "display_name": "AI21: Jamba Large 1.7", + "id": "stealth/claude-opus-4.6", + "name": "Stealth: Claude Opus 4.6 (20% off)", + "display_name": "Stealth: Claude Opus 4.6 (20% off)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-08-09", - "last_updated": "2026-03-15", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "mancer/weaver", - "name": "Mancer: Weaver (alpha)", - "display_name": "Mancer: Weaver (alpha)", + "id": "inception/mercury-2", + "name": "Inception: Mercury 2", + "display_name": "Inception: Mercury 2", "modalities": { "input": [ "text" @@ -132777,51 +137470,54 @@ ] }, "limit": { - "context": 8000, - "output": 2000 + "context": 128000, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2023-08-02", - "last_updated": "2026-03-15", + "release_date": "2026-03-04", + "last_updated": "2026-03-04", "type": "chat" }, { - "id": "morph/morph-v3-large", - "name": "Morph: Morph V3 Large", - "display_name": "Morph: Morph V3 Large", + "id": "rekaai/reka-edge", + "name": "Reka Edge", + "display_name": "Reka Edge", "modalities": { "input": [ - "text" + "image", + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-08-15", - "last_updated": "2024-08-15", + "release_date": "2026-03-20", + "last_updated": "2026-03-20", "type": "chat" }, { - "id": "morph/morph-v3-fast", - "name": "Morph: Morph V3 Fast", - "display_name": "Morph: Morph V3 Fast", + "id": "rekaai/reka-flash-3", + "name": "Reka Flash 3", + "display_name": "Reka Flash 3", "modalities": { "input": [ "text" @@ -132831,24 +137527,25 @@ ] }, "limit": { - "context": 81920, - "output": 38000 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-08-15", - "last_updated": "2024-08-15", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "nousresearch/hermes-3-llama-3.1-70b", - "name": "Nous: Hermes 3 70B Instruct", - "display_name": "Nous: Hermes 3 70B Instruct", + "id": "tencent/hunyuan-a13b-instruct", + "name": "Tencent: Hunyuan A13B Instruct", + "display_name": "Tencent: Hunyuan A13B Instruct", "modalities": { "input": [ "text" @@ -132859,23 +137556,24 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2024-08-18", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" }, { - "id": "nousresearch/hermes-2-pro-llama-3-8b", - "name": "NousResearch: Hermes 2 Pro - Llama-3 8B", - "display_name": "NousResearch: Hermes 2 Pro - Llama-3 8B", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -132885,24 +137583,30 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-05-27", - "last_updated": "2024-06-27", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "nousresearch/hermes-3-llama-3.1-405b", - "name": "Nous: Hermes 3 405B Instruct", - "display_name": "Nous: Hermes 3 405B Instruct", + "id": "tencent/hy3-preview", + "name": "Hy3 preview", + "display_name": "Hy3 preview", "modalities": { "input": [ "text" @@ -132912,24 +137616,30 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-08-16", - "last_updated": "2024-08-16", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "nousresearch/hermes-4-405b", - "name": "Nous: Hermes 4 405B", - "display_name": "Nous: Hermes 4 405B", + "id": "tencent/hy3:free", + "name": "Tencent: Hy3 (free)", + "display_name": "Tencent: Hy3 (free)", "modalities": { "input": [ "text" @@ -132939,25 +137649,25 @@ ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 262144, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-08-25", - "last_updated": "2025-08-25", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "nousresearch/hermes-4-70b", - "name": "Nous: Hermes 4 70B", - "display_name": "Nous: Hermes 4 70B", + "id": "upstage/solar-pro-3", + "name": "Upstage: Solar Pro 3", + "display_name": "Upstage: Solar Pro 3", "modalities": { "input": [ "text" @@ -132971,24 +137681,53 @@ "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-25", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "poolside/laguna-m.1:free", - "name": "Poolside: Laguna M.1 (free)", - "display_name": "Poolside: Laguna M.1 (free)", + "id": "mistralai/mistral-large", + "name": "Mistral Large", + "display_name": "Mistral Large", "modalities": { "input": [ + "text", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 25600 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-02-26", + "last_updated": "2024-02-26", + "type": "chat" + }, + { + "id": "mistralai/ministral-8b-2512", + "name": "Mistral: Ministral 3 8B 2512", + "display_name": "Mistral: Ministral 3 8B 2512", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" @@ -133001,47 +137740,74 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "mistralai/ministral-14b-2512", + "name": "Mistral: Ministral 3 14B 2512", + "display_name": "Mistral: Ministral 3 14B 2512", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 52429 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "poolside/laguna-xs.2:free", - "name": "Poolside: Laguna XS.2 (free)", - "display_name": "Poolside: Laguna XS.2 (free)", + "id": "mistralai/ministral-3b-2512", + "name": "Mistral: Ministral 3 3B 2512", + "display_name": "Mistral: Ministral 3 3B 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "minimax/minimax-m2-her", - "name": "MiniMax: MiniMax M2-her", - "display_name": "MiniMax: MiniMax M2-her", + "id": "mistralai/mistral-small-24b-instruct-2501", + "name": "Mistral: Mistral Small 3", + "display_name": "Mistral: Mistral Small 3", "modalities": { "input": [ "text" @@ -133051,8 +137817,8 @@ ] }, "limit": { - "context": 65536, - "output": 2048 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": false, @@ -133060,89 +137826,72 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-01-23", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-01-30", + "last_updated": "2025-01-30", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax: MiniMax M2.7", - "display_name": "MiniMax: MiniMax M2.7", + "id": "mistralai/mistral-large-2407", + "name": "Mistral Large 2407", + "display_name": "Mistral Large 2407", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "release_date": "2024-11-19", + "last_updated": "2024-11-19", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax: MiniMax M3", - "display_name": "MiniMax: MiniMax M3", + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral: Mistral Medium 3.1", + "display_name": "Mistral: Mistral Medium 3.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 131072, + "output": 26215 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-30", + "open_weights": false, + "release_date": "2025-08-13", + "last_updated": "2025-08-13", "type": "chat" }, { - "id": "minimax/minimax-m1", - "name": "MiniMax: MiniMax M1", - "display_name": "MiniMax: MiniMax M1", + "id": "mistralai/mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ "text" @@ -133152,69 +137901,65 @@ ] }, "limit": { - "context": 1000000, - "output": 40000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax: MiniMax M2.5", - "display_name": "MiniMax: MiniMax M2.5", + "id": "mistralai/mistral-saba", + "name": "Mistral: Saba", + "display_name": "Mistral: Saba", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2025-02-17", + "last_updated": "2025-02-17", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax: MiniMax M2", - "display_name": "MiniMax: MiniMax M2", + "id": "mistralai/mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -133222,112 +137967,105 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-10-23", - "last_updated": "2026-03-15", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "minimax/minimax-01", - "name": "MiniMax: MiniMax-01", - "display_name": "MiniMax: MiniMax-01", + "id": "mistralai/codestral-2508", + "name": "Mistral: Codestral 2508", + "display_name": "Mistral: Codestral 2508", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000192, - "output": 1000192 + "context": 256000, + "output": 51200 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "open_weights": false, + "release_date": "2025-08-01", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax: MiniMax M2.1", - "display_name": "MiniMax: MiniMax M2.1", + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mistral: Mixtral 8x22B Instruct", + "display_name": "Mistral: Mixtral 8x22B Instruct", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 39322 + "context": 65536, + "output": 13108 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "release_date": "2024-04-17", + "last_updated": "2024-04-17", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-exp", - "name": "DeepSeek: DeepSeek V3.2 Exp", - "display_name": "DeepSeek: DeepSeek V3.2 Exp", + "id": "mistralai/voxtral-small-24b-2507", + "name": "Mistral: Voxtral Small 24B 2507", + "display_name": "Mistral: Voxtral Small 24B 2507", "modalities": { "input": [ - "text" + "text", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 32000, + "output": 6400 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-01-01", - "last_updated": "2025-09-29", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-30", + "last_updated": "2025-10-30", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek: DeepSeek V4 Flash", - "display_name": "DeepSeek: DeepSeek V4 Flash", + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral: Mistral Small 3.2 24B", + "display_name": "Mistral: Mistral Small 3.2 24B", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -133335,94 +138073,87 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-05-01", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "deepseek/deepseek-chat-v3-0324", - "name": "DeepSeek: DeepSeek V3 0324", - "display_name": "DeepSeek: DeepSeek V3 0324", + "id": "mistralai/mistral-medium-3-5", + "name": "Mistral: Mistral Medium 3.5", + "display_name": "Mistral: Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-speciale", - "name": "DeepSeek: DeepSeek V3.2 Speciale", - "display_name": "DeepSeek: DeepSeek V3.2 Speciale", + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral: Mistral Small 3.1 24B", + "display_name": "Mistral: Mistral Small 3.1 24B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "deepseek/deepseek-r1-distill-llama-70b", - "name": "DeepSeek: R1 Distill Llama 70B", - "display_name": "DeepSeek: R1 Distill Llama 70B", + "id": "mistralai/mistral-medium-3", + "name": "Mistral: Mistral Medium 3", + "display_name": "Mistral: Mistral Medium 3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -133430,70 +138161,56 @@ }, "limit": { "context": 131072, - "output": 16384 + "output": 26215 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-01-23", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek: DeepSeek V4 Pro", - "display_name": "DeepSeek: DeepSeek V4 Pro", + "id": "mistralai/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 52429 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-05-01", + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek: R1 0528", - "display_name": "DeepSeek: R1 0528", + "id": "bytedance/ui-tars-1.5-7b", + "name": "ByteDance: UI-TARS 7B ", + "display_name": "ByteDance: UI-TARS 7B ", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -133501,47 +138218,36 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 128000, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek: DeepSeek V3.2", - "display_name": "DeepSeek: DeepSeek V3.2", + "id": "nex-agi/nex-n2-mini", + "name": "Nex AGI: Nex-N2-Mini", + "display_name": "Nex AGI: Nex-N2-Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -133549,32 +138255,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-24", + "last_updated": "2026-06-24", "type": "chat" }, { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek: R1", - "display_name": "DeepSeek: R1", + "id": "nex-agi/nex-n2-pro", + "name": "Nex AGI: Nex-N2-Pro", + "display_name": "Nex AGI: Nex-N2-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 16000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -133582,27 +138284,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-08", + "last_updated": "2026-06-08", "type": "chat" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek: DeepSeek V3", - "display_name": "DeepSeek: DeepSeek V3", + "id": "thedrummer/rocinante-12b", + "name": "TheDrummer: Rocinante 12B", + "display_name": "TheDrummer: Rocinante 12B", "modalities": { "input": [ "text" @@ -133612,24 +138303,24 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-12-01", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2024-09-30", + "last_updated": "2024-09-30", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1-terminus", - "name": "DeepSeek: DeepSeek V3.1 Terminus", - "display_name": "DeepSeek: DeepSeek V3.1 Terminus", + "id": "thedrummer/unslopnemo-12b", + "name": "TheDrummer: UnslopNemo 12B", + "display_name": "TheDrummer: UnslopNemo 12B", "modalities": { "input": [ "text" @@ -133639,25 +138330,24 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 1024000, + "output": 1024000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "open_weights": false, + "release_date": "2024-11-08", + "last_updated": "2024-11-08", "type": "chat" }, { - "id": "deepseek/deepseek-r1-distill-qwen-32b", - "name": "DeepSeek: R1 Distill Qwen 32B", - "display_name": "DeepSeek: R1 Distill Qwen 32B", + "id": "thedrummer/cydonia-24b-v4.1", + "name": "TheDrummer: Cydonia 24B V4.1", + "display_name": "TheDrummer: Cydonia 24B V4.1", "modalities": { "input": [ "text" @@ -133667,25 +138357,24 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-01-01", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "2025-09-27", + "last_updated": "2025-09-27", "type": "chat" }, { - "id": "deepseek/deepseek-chat-v3.1", - "name": "DeepSeek: DeepSeek V3.1", - "display_name": "DeepSeek: DeepSeek V3.1", + "id": "thedrummer/skyfall-36b-v2", + "name": "TheDrummer: Skyfall 36B V2", + "display_name": "TheDrummer: Skyfall 36B V2", "modalities": { "input": [ "text" @@ -133696,27 +138385,25 @@ }, "limit": { "context": 32768, - "output": 7168 + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "open_weights": false, + "release_date": "2025-03-10", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "amazon/nova-premier-v1", - "name": "Amazon: Nova Premier 1.0", - "display_name": "Amazon: Nova Premier 1.0", + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "display_name": "ReMM SLERP 13B", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -133724,38 +138411,39 @@ ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 6144, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-11-01", - "last_updated": "2026-03-15", + "release_date": "2023-07-22", + "last_updated": "2023-07-22", "type": "chat" }, { - "id": "amazon/nova-2-lite-v1", - "name": "Amazon: Nova 2 Lite", - "display_name": "Amazon: Nova 2 Lite", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ + "text", "image", + "video", "pdf", - "text", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -133763,44 +138451,48 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2026-03-15", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "amazon/nova-pro-v1", - "name": "Amazon: Nova Pro 1.0", - "display_name": "Amazon: Nova Pro 1.0", + "id": "gryphe/mythomax-l2-13b", + "name": "MythoMax 13B", + "display_name": "MythoMax 13B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 5120 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2023-07-02", + "last_updated": "2023-07-02", "type": "chat" }, { - "id": "amazon/nova-micro-v1", - "name": "Amazon: Nova Micro 1.0", - "display_name": "Amazon: Nova Micro 1.0", + "id": "inclusionai/ring-2.6-1t", + "name": "inclusionAI: Ring-2.6-1T", + "display_name": "inclusionAI: Ring-2.6-1T", "modalities": { "input": [ "text" @@ -133810,27 +138502,27 @@ ] }, "limit": { - "context": 128000, - "output": 5120 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2026-03-15", + "release_date": "2026-05-08", + "last_updated": "2026-05-08", "type": "chat" }, { - "id": "amazon/nova-lite-v1", - "name": "Amazon: Nova Lite 1.0", - "display_name": "Amazon: Nova Lite 1.0", + "id": "inclusionai/ling-2.6-1t", + "name": "inclusionAI: Ling-2.6-1T", + "display_name": "inclusionAI: Ling-2.6-1T", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -133838,24 +138530,24 @@ ] }, "limit": { - "context": 300000, - "output": 5120 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2026-03-15", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "ibm-granite/granite-4.0-h-micro", - "name": "IBM: Granite 4.0 Micro", - "display_name": "IBM: Granite 4.0 Micro", + "id": "inclusionai/ling-2.6-flash", + "name": "inclusionAI: Ling-2.6-flash", + "display_name": "inclusionAI: Ling-2.6-flash", "modalities": { "input": [ "text" @@ -133865,24 +138557,24 @@ ] }, "limit": { - "context": 131000, + "context": 262144, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-10-20", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "ibm-granite/granite-4.1-8b", - "name": "IBM: Granite 4.1 8B", - "display_name": "IBM: Granite 4.1 8B", + "id": "inclusionai/ling-3.0-flash:free", + "name": "Ling-3.0-flash (free)", + "display_name": "Ling-3.0-flash (free)", "modalities": { "input": [ "text" @@ -133892,28 +138584,27 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-05-01", + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "x-ai/grok-4.20-multi-agent", - "name": "xAI: Grok 4.20 Multi-Agent", - "display_name": "xAI: Grok 4.20 Multi-Agent", + "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition", + "name": "Venice: Uncensored", + "display_name": "Venice: Uncensored", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -133921,63 +138612,54 @@ ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-04-11", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "xAI: Grok 4.3", - "display_name": "xAI: Grok 4.3", + "id": "allenai/olmo-3-32b-think", + "name": "AllenAI: Olmo 3 32B Think", + "display_name": "AllenAI: Olmo 3 32B Think", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 4096 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "release_date": "2025-11-21", + "last_updated": "2025-11-21", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "xAI: Grok Build 0.1", - "display_name": "xAI: Grok Build 0.1", + "id": "meituan/longcat-2.0", + "name": "Meituan: LongCat 2.0", + "display_name": "Meituan: LongCat 2.0", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -133985,8 +138667,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048756, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -133999,20 +138681,18 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-05-20", - "last_updated": "2026-05-27", + "release_date": "2026-07-20", + "last_updated": "2026-07-20", "type": "chat" }, { - "id": "x-ai/grok-4.20", - "name": "xAI: Grok 4.20", - "display_name": "xAI: Grok 4.20", + "id": "ai21/jamba-large-1.7", + "name": "AI21: Jamba Large 1.7", + "display_name": "AI21: Jamba Large 1.7", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -134020,25 +138700,24 @@ ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 256000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-04-11", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "type": "chat" }, { - "id": "kwaipilot/kat-coder-pro-v2", - "name": "Kwaipilot: KAT-Coder-Pro V2", - "display_name": "Kwaipilot: KAT-Coder-Pro V2", + "id": "mancer/weaver", + "name": "Mancer: Weaver (alpha)", + "display_name": "Mancer: Weaver (alpha)", "modalities": { "input": [ "text" @@ -134048,24 +138727,24 @@ ] }, "limit": { - "context": 256000, - "output": 80000 + "context": 8000, + "output": 2000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-27", - "last_updated": "2026-04-11", + "open_weights": false, + "release_date": "2023-08-02", + "last_updated": "2023-08-02", "type": "chat" }, { - "id": "sao10k/l3.1-euryale-70b", - "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", - "display_name": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "id": "morph/morph-v3-large", + "name": "Morph: Morph V3 Large", + "display_name": "Morph: Morph V3 Large", "modalities": { "input": [ "text" @@ -134075,24 +138754,24 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-08-28", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "sao10k/l3.3-euryale-70b", - "name": "Sao10K: Llama 3.3 Euryale 70B", - "display_name": "Sao10K: Llama 3.3 Euryale 70B", + "id": "morph/morph-v3-fast", + "name": "Morph: Morph V3 Fast", + "display_name": "Morph: Morph V3 Fast", "modalities": { "input": [ "text" @@ -134102,8 +138781,8 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 81920, + "output": 38000 }, "temperature": true, "tool_call": false, @@ -134111,15 +138790,15 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-12-18", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "sao10k/l3-lunaris-8b", - "name": "Sao10K: Llama 3 8B Lunaris", - "display_name": "Sao10K: Llama 3 8B Lunaris", + "id": "nousresearch/hermes-3-llama-3.1-70b", + "name": "Nous: Hermes 3 70B Instruct", + "display_name": "Nous: Hermes 3 70B Instruct", "modalities": { "input": [ "text" @@ -134129,8 +138808,8 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": false, @@ -134138,15 +138817,15 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-08-13", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2024-08-18", + "last_updated": "2024-08-18", "type": "chat" }, { - "id": "sao10k/l3-euryale-70b", - "name": "Sao10k: Llama 3 Euryale 70B v2.1", - "display_name": "Sao10k: Llama 3 Euryale 70B v2.1", + "id": "nousresearch/hermes-3-llama-3.1-405b", + "name": "Nous: Hermes 3 405B Instruct", + "display_name": "Nous: Hermes 3 405B Instruct", "modalities": { "input": [ "text" @@ -134156,24 +138835,24 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-06-18", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2024-08-16", + "last_updated": "2024-08-16", "type": "chat" }, { - "id": "sao10k/l3.1-70b-hanami-x1", - "name": "Sao10K: Llama 3.1 70B Hanami x1", - "display_name": "Sao10K: Llama 3.1 70B Hanami x1", + "id": "nousresearch/hermes-4-405b", + "name": "Nous: Hermes 4 405B", + "display_name": "Nous: Hermes 4 405B", "modalities": { "input": [ "text" @@ -134183,24 +138862,25 @@ ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 131072, + "output": 26215 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2025-01-08", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "openrouter/pareto-code", - "name": "Pareto Code Router", - "display_name": "Pareto Code Router", + "id": "nousresearch/hermes-4-70b", + "name": "Nous: Hermes 4 70B", + "display_name": "Nous: Hermes 4 70B", "modalities": { "input": [ "text" @@ -134210,24 +138890,25 @@ ] }, "limit": { - "context": 200000, - "output": 65536 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-05-01", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "openrouter/owl-alpha", - "name": "Owl Alpha", - "display_name": "Owl Alpha", + "id": "poolside/laguna-xs-2.1", + "name": "Poolside: Laguna XS 2.1", + "display_name": "Poolside: Laguna XS 2.1", "modalities": { "input": [ "text" @@ -134237,8 +138918,8 @@ ] }, "limit": { - "context": 1048756, - "output": 262144 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -134246,16 +138927,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-30", + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "openrouter/bodybuilder", - "name": "Body Builder (beta)", - "display_name": "Body Builder (beta)", + "id": "poolside/laguna-s-2.1", + "name": "Poolside: Laguna S 2.1", + "display_name": "Poolside: Laguna S 2.1", "modalities": { "input": [ "text" @@ -134265,26 +138951,32 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openrouter/free", - "name": "Free Models Router", - "display_name": "Free Models Router", + "id": "poolside/laguna-s-2.1:free", + "name": "Poolside: Laguna S 2.1 (free)", + "display_name": "Poolside: Laguna S 2.1 (free)", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -134292,7 +138984,7 @@ ] }, "limit": { - "context": 200000, + "context": 262144, "output": 32768 }, "temperature": true, @@ -134301,31 +138993,26 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-01", - "last_updated": "2026-03-15", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openrouter/auto", - "name": "Auto Router", - "display_name": "Auto Router", + "id": "poolside/laguna-xs-2.1:free", + "name": "Poolside: Laguna XS 2.1 (free)", + "display_name": "Poolside: Laguna XS 2.1 (free)", "modalities": { "input": [ - "audio", - "image", - "pdf", - "text", - "video" + "text" ], "output": [ - "image", "text" ] }, "limit": { - "context": 2000000, + "context": 262144, "output": 32768 }, "temperature": true, @@ -134334,21 +139021,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "aion-labs/aion-1.0-mini", - "name": "AionLabs: Aion-1.0-Mini", - "display_name": "AionLabs: Aion-1.0-Mini", + "id": "minimax/minimax-m2-her", + "name": "MiniMax: MiniMax M2-her", + "display_name": "MiniMax: MiniMax M2-her", "modalities": { "input": [ "text" @@ -134358,25 +139040,24 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 65536, + "output": 2048 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2026-03-15", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "aion-labs/aion-2.0", - "name": "AionLabs: Aion-2.0", - "display_name": "AionLabs: Aion-2.0", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -134386,25 +139067,71 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-03-15", + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 512000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "aion-labs/aion-1.0", - "name": "AionLabs: Aion-1.0", - "display_name": "AionLabs: Aion-1.0", + "id": "minimax/minimax-m1", + "name": "MiniMax: MiniMax M1", + "display_name": "MiniMax: MiniMax M1", "modalities": { "input": [ "text" @@ -134414,25 +139141,25 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 40000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2026-03-15", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "aion-labs/aion-rp-llama-3.1-8b", - "name": "AionLabs: Aion-RP 1.0 (8B)", - "display_name": "AionLabs: Aion-RP 1.0 (8B)", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -134442,24 +139169,30 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 196608, + "output": 196608 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2026-03-15", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "inflection/inflection-3-pi", - "name": "Inflection: Inflection 3 Pi", - "display_name": "Inflection: Inflection 3 Pi", + "id": "minimax/minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -134469,66 +139202,69 @@ ] }, "limit": { - "context": 8000, - "output": 1024 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-10-11", - "last_updated": "2026-03-15", + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "inflection/inflection-3-productivity", - "name": "Inflection: Inflection 3 Productivity", - "display_name": "Inflection: Inflection 3 Productivity", + "id": "minimax/minimax-01", + "name": "MiniMax: MiniMax-01", + "display_name": "MiniMax: MiniMax-01", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 1024 + "context": 1000192, + "output": 1000192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-10-11", - "last_updated": "2026-03-15", + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" }, { - "id": "xiaomi/mimo-v2-omni", - "name": "Xiaomi: MiMo-V2-Omni", - "display_name": "Xiaomi: MiMo-V2-Omni", + "id": "minimax/minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -134536,17 +139272,21 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "xiaomi/mimo-v2-flash", - "name": "Xiaomi: MiMo-V2-Flash", - "display_name": "Xiaomi: MiMo-V2-Flash", + "id": "deepseek/deepseek-v3.2-exp", + "name": "DeepSeek: DeepSeek V3.2 Exp", + "display_name": "DeepSeek: DeepSeek V3.2 Exp", "modalities": { "input": [ "text" @@ -134556,7 +139296,7 @@ ] }, "limit": { - "context": 262144, + "context": 163840, "output": 65536 }, "temperature": true, @@ -134566,16 +139306,15 @@ "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12-01", - "release_date": "2025-12-16", - "last_updated": "2026-02-04", + "open_weights": false, + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "xiaomi/mimo-v2-pro", - "name": "Xiaomi: MiMo-V2-Pro", - "display_name": "Xiaomi: MiMo-V2-Pro", + "id": "deepseek/deepseek-v4-pro:discounted", + "name": "DeepSeek: DeepSeek V4 Pro (lowest price)", + "display_name": "DeepSeek: DeepSeek V4 Pro (lowest price)", "modalities": { "input": [ "text" @@ -134586,7 +139325,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -134596,21 +139335,17 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "Xiaomi: MiMo-V2.5", - "display_name": "Xiaomi: MiMo-V2.5", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" @@ -134618,7 +139353,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 393216 }, "temperature": true, "tool_call": true, @@ -134637,17 +139372,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "Xiaomi: MiMo V2.5 Pro", - "display_name": "Xiaomi: MiMo V2.5 Pro", + "id": "deepseek/deepseek-chat-v3-0324", + "name": "DeepSeek: DeepSeek V3 0324", + "display_name": "DeepSeek: DeepSeek V3 0324", "modalities": { "input": [ "text" @@ -134657,37 +139392,24 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "writer/palmyra-x5", - "name": "Writer: Palmyra X5", - "display_name": "Writer: Palmyra X5", + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek: R1 Distill Llama 70B", + "display_name": "DeepSeek: R1 Distill Llama 70B", "modalities": { "input": [ "text" @@ -134697,27 +139419,32 @@ ] }, "limit": { - "context": 1040000, + "context": 8192, "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2025-01-23", + "last_updated": "2025-01-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Anthropic: Claude Sonnet 4.6", - "display_name": "Anthropic: Claude Sonnet 4.6", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -134725,58 +139452,39 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "display_name": "Anthropic: Claude Opus 4.1", + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek: R1 0528", + "display_name": "DeepSeek: R1 0528", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -134784,50 +139492,38 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2026-03-15", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Anthropic: Claude Opus 4.5", - "display_name": "Anthropic: Claude Opus 4.5", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -134835,140 +139531,106 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-24", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "display_name": "Anthropic: Claude 3.5 Haiku", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek: DeepSeek V3.2", + "display_name": "DeepSeek: DeepSeek V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Anthropic: Claude Opus 4.7", - "display_name": "Anthropic: Claude Opus 4.7", + "id": "deepseek/deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 64000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-05-01", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "display_name": "Anthropic: Claude Sonnet 4.5", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -134976,77 +139638,55 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "display_name": "Anthropic: Claude 3 Haiku", + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek: DeepSeek V3.1 Terminus", + "display_name": "DeepSeek: DeepSeek V3.1 Terminus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-03-07", - "last_updated": "2024-03-07", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6-fast", - "name": "Anthropic: Claude Opus 4.6 (Fast)", - "display_name": "Anthropic: Claude Opus 4.6 (Fast)", + "id": "deepseek/deepseek-v4-flash:discounted", + "name": "DeepSeek: DeepSeek V4 Flash (lowest price)", + "display_name": "DeepSeek: DeepSeek V4 Flash (lowest price)", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -135054,58 +139694,27 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-04-07", - "last_updated": "2026-04-11", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "display_name": "Anthropic: Claude Sonnet 4", + "id": "deepseek/deepseek-chat-v3.1", + "name": "DeepSeek: DeepSeek V3.1", + "display_name": "DeepSeek: DeepSeek V3.1", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -135113,147 +139722,84 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2026-03-15", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "display_name": "Anthropic: Claude Haiku 4.5", + "id": "amazon/nova-premier-v1", + "name": "Amazon: Nova Premier 1.0", + "display_name": "Amazon: Nova Premier 1.0", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-10-31", + "last_updated": "2025-10-31", "type": "chat" }, { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "display_name": "Anthropic: Claude Opus 4", + "id": "amazon/nova-2-lite-v1", + "name": "Amazon: Nova 2 Lite", + "display_name": "Amazon: Nova 2 Lite", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2026-03-15", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Anthropic: Claude Opus 4.6", - "display_name": "Anthropic: Claude Opus 4.6", + "id": "amazon/nova-pro-v1", + "name": "Amazon: Nova Pro 1.0", + "display_name": "Amazon: Nova Pro 1.0", "modalities": { "input": [ "text", @@ -135264,58 +139810,26 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 300000, + "output": 5120 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7-fast", - "name": "Anthropic: Claude Opus 4.7 (Fast)", - "display_name": "Anthropic: Claude Opus 4.7 (Fast)", + "id": "amazon/nova-micro-v1", + "name": "Amazon: Nova Micro 1.0", + "display_name": "Amazon: Nova Micro 1.0", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -135323,51 +139837,52 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 5120 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2024-12-05", + "last_updated": "2024-12-05", + "type": "chat" + }, + { + "id": "amazon/nova-lite-v1", + "name": "Amazon: Nova Lite 1.0", + "display_name": "Amazon: Nova Lite 1.0", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 300000, + "output": 5120 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-16", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "liquid/lfm-2-24b-a2b", - "name": "LiquidAI: LFM2-24B-A2B", - "display_name": "LiquidAI: LFM2-24B-A2B", + "id": "ibm-granite/granite-4.0-h-micro", + "name": "IBM: Granite 4.0 Micro", + "display_name": "IBM: Granite 4.0 Micro", "modalities": { "input": [ "text" @@ -135377,8 +139892,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": false, @@ -135386,20 +139901,18 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2025-10-20", + "last_updated": "2025-10-20", "type": "chat" }, { - "id": "z-ai/glm-4.6v", - "name": "Z.ai: GLM 4.6V", - "display_name": "Z.ai: GLM 4.6V", + "id": "ibm-granite/granite-4.1-8b", + "name": "IBM: Granite 4.1 8B", + "display_name": "IBM: Granite 4.1 8B", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" @@ -135411,31 +139924,62 @@ }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", + "type": "chat" + }, + { + "id": "x-ai/grok-4.20-multi-agent", + "name": "SpaceXAI: Grok 4.20 Multi-Agent", + "display_name": "SpaceXAI: Grok 4.20 Multi-Agent", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 2000000, + "output": 2000000 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2025-09-30", - "last_updated": "2026-01-10", + "open_weights": false, + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "Z.ai: GLM 5", - "display_name": "Z.ai: GLM 5", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -135445,36 +139989,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "z-ai/glm-4.5-air", - "name": "Z.ai: GLM 4.5 Air", - "display_name": "Z.ai: GLM 4.5 Air", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -135482,27 +140022,34 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "Z.ai: GLM 5.1", - "display_name": "Z.ai: GLM 5.1", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -135515,27 +140062,29 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "z-ai/glm-4.7-flash", - "name": "Z.ai: GLM 4.7 Flash", - "display_name": "Z.ai: GLM 4.7 Flash", + "id": "x-ai/grok-4.20", + "name": "SpaceXAI: Grok 4.20", + "display_name": "SpaceXAI: Grok 4.20", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 40551 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, @@ -135543,21 +140092,43 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "attachment": true, + "open_weights": false, + "release_date": "2026-03-31", + "last_updated": "2026-03-31", + "type": "chat" + }, + { + "id": "kwaipilot/kat-coder-pro-v2", + "name": "Kwaipilot: KAT-Coder-Pro V2", + "display_name": "Kwaipilot: KAT-Coder-Pro V2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 80000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "open_weights": false, + "release_date": "2026-03-27", + "last_updated": "2026-03-27", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "Z.ai: GLM 4.6", - "display_name": "Z.ai: GLM 4.6", + "id": "kwaipilot/kat-coder-pro-v2.5", + "name": "Kwaipilot: KAT-Coder-Pro V2.5", + "display_name": "Kwaipilot: KAT-Coder-Pro V2.5", "modalities": { "input": [ "text" @@ -135567,30 +140138,24 @@ ] }, "limit": { - "context": 204800, - "output": 204800 + "context": 256000, + "output": 80000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-09-30", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-07-10", + "last_updated": "2026-07-10", "type": "chat" }, { - "id": "z-ai/glm-4.5", - "name": "Z.ai: GLM 4.5", - "display_name": "Z.ai: GLM 4.5", + "id": "kwaipilot/kat-coder-air-v2.5", + "name": "Kwaipilot: KAT-Coder-Air V2.5", + "display_name": "Kwaipilot: KAT-Coder-Air V2.5", "modalities": { "input": [ "text" @@ -135600,54 +140165,51 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 256000, + "output": 80000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-07-10", + "last_updated": "2026-07-10", "type": "chat" }, { - "id": "z-ai/glm-4.5v", - "name": "Z.ai: GLM 4.5V", - "display_name": "Z.ai: GLM 4.5V", + "id": "sao10k/l3.1-euryale-70b", + "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "display_name": "Sao10K: Llama 3.1 Euryale 70B v2.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, + "context": 131072, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "attachment": false, + "open_weights": false, + "release_date": "2024-08-28", + "last_updated": "2024-08-28", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "Z.ai: GLM 4.7", - "display_name": "Z.ai: GLM 4.7", + "id": "sao10k/l3.3-euryale-70b", + "name": "Sao10K: Llama 3.3 Euryale 70B", + "display_name": "Sao10K: Llama 3.3 Euryale 70B", "modalities": { "input": [ "text" @@ -135657,36 +140219,24 @@ ] }, "limit": { - "context": 202752, - "output": 65535 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-22", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2024-12-18", + "last_updated": "2024-12-18", "type": "chat" }, { - "id": "z-ai/glm-4-32b", - "name": "Z.ai: GLM 4 32B ", - "display_name": "Z.ai: GLM 4 32B ", + "id": "sao10k/l3-lunaris-8b", + "name": "Sao10K: Llama 3 8B Lunaris", + "display_name": "Sao10K: Llama 3 8B Lunaris", "modalities": { "input": [ "text" @@ -135696,24 +140246,24 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 8192, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2024-08-13", + "last_updated": "2024-08-13", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "Z.ai: GLM 5 Turbo", - "display_name": "Z.ai: GLM 5 Turbo", + "id": "openrouter/pareto-code", + "name": "Pareto Code Router", + "display_name": "Pareto Code Router", "modalities": { "input": [ "text" @@ -135723,117 +140273,117 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 200000, + "output": 65536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-15", - "last_updated": "2026-04-11", + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "Z.ai: GLM 5V Turbo", - "display_name": "Z.ai: GLM 5V Turbo", + "id": "openrouter/bodybuilder", + "name": "Body Builder (beta)", + "display_name": "Body Builder (beta)", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 128000, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-04-11", + "attachment": false, + "open_weights": false, + "release_date": "2026-03-15", + "last_updated": "2026-03-15", "type": "chat" }, { - "id": "switchpoint/router", - "name": "Switchpoint Router", - "display_name": "Switchpoint Router", + "id": "openrouter/free", + "name": "OpenRouter Free Models Router", + "display_name": "OpenRouter Free Models Router", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 200000, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-07-12", - "last_updated": "2026-03-15", + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "perplexity/sonar-pro-search", - "name": "Perplexity: Sonar Pro Search", - "display_name": "Perplexity: Sonar Pro Search", + "id": "openrouter/auto", + "name": "Auto Router", + "display_name": "Auto Router", "modalities": { "input": [ + "audio", "image", - "text" + "pdf", + "text", + "video" ], "output": [ + "image", "text" ] }, "limit": { - "context": 200000, - "output": 8000 + "context": 2000000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": false, - "release_date": "2025-10-31", + "release_date": "2026-03-15", "last_updated": "2026-03-15", "type": "chat" }, { - "id": "perplexity/sonar-deep-research", - "name": "Perplexity: Sonar Deep Research", - "display_name": "Perplexity: Sonar Deep Research", + "id": "aion-labs/aion-2.0", + "name": "AionLabs: Aion-2.0", + "display_name": "AionLabs: Aion-2.0", "modalities": { "input": [ "text" @@ -135843,122 +140393,122 @@ ] }, "limit": { - "context": 128000, - "output": 25600 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "perplexity/sonar", - "name": "Perplexity: Sonar", - "display_name": "Perplexity: Sonar", + "id": "aion-labs/aion-3.0-mini", + "name": "AionLabs: Aion-3.0-Mini", + "display_name": "AionLabs: Aion-3.0-Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 127072, - "output": 25415 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "release_date": "2026-07-07", + "last_updated": "2026-07-07", "type": "chat" }, { - "id": "perplexity/sonar-pro", - "name": "Perplexity: Sonar Pro", - "display_name": "Perplexity: Sonar Pro", + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "AionLabs: Aion-RP 1.0 (8B)", + "display_name": "AionLabs: Aion-RP 1.0 (8B)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "release_date": "2025-02-04", + "last_updated": "2025-02-04", "type": "chat" }, { - "id": "perplexity/sonar-reasoning-pro", - "name": "Perplexity: Sonar Reasoning Pro", - "display_name": "Perplexity: Sonar Reasoning Pro", + "id": "aion-labs/aion-3.0", + "name": "AionLabs: Aion-3.0", + "display_name": "AionLabs: Aion-3.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 25600 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "release_date": "2026-07-07", + "last_updated": "2026-07-07", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "MoonshotAI: Kimi K2.5", - "display_name": "MoonshotAI: Kimi K2.5", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ + "text", "image", - "text" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65535 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -135979,26 +140529,26 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-03-15", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "MoonshotAI: Kimi K2.6", - "display_name": "MoonshotAI: Kimi K2.6", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65535 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -136008,19 +140558,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-20", - "last_updated": "2026-05-12", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai/kimi-k2", - "name": "MoonshotAI: Kimi K2 0711", - "display_name": "MoonshotAI: Kimi K2 0711", + "id": "writer/palmyra-x5", + "name": "Writer: Palmyra X5", + "display_name": "Writer: Palmyra X5", "modalities": { "input": [ "text" @@ -136030,102 +140587,153 @@ ] }, "limit": { - "context": 131000, - "output": 26215 + "context": 1040000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-01-21", + "last_updated": "2026-01-21", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "MoonshotAI: Kimi K2 Thinking", - "display_name": "MoonshotAI: Kimi K2 Thinking", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65535 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-11-06", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "moonshotai/kimi-k2-0905", - "name": "MoonshotAI: Kimi K2 0905", - "display_name": "MoonshotAI: Kimi K2 0905", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "OpenAI: GPT-5.1-Codex-Mini", - "display_name": "OpenAI: GPT-5.1-Codex-Mini", + "id": "anthropic/claude-opus-4.8-fast", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -136138,117 +140746,148 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-chat-latest", - "name": "OpenAI: GPT Chat Latest", - "display_name": "OpenAI: GPT Chat Latest", + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-05", - "last_updated": "2026-05-07", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "OpenAI: GPT-5.2 Pro", - "display_name": "OpenAI: GPT-5.2 Pro", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2026-03-15", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "OpenAI: GPT-5.5 Pro", - "display_name": "OpenAI: GPT-5.5 Pro", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -136260,72 +140899,117 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-05-01", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "display_name": "OpenAI: GPT-4.1 Mini", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2026-03-15", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "display_name": "OpenAI: GPT-4o", + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "display_name": "Anthropic: Claude 3 Haiku", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -136334,125 +141018,101 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2026-03-15", + "release_date": "2024-03-13", + "last_updated": "2024-03-13", "type": "chat" }, { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "display_name": "OpenAI: GPT-5 Chat", + "id": "anthropic/claude-opus-5-fast", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2026-03-15", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "OpenAI: GPT-5.4 Pro", - "display_name": "OpenAI: GPT-5.4 Pro", + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "display_name": "Anthropic: Claude Sonnet 4", "modalities": { "input": [ "image", - "pdf", - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-06", - "last_updated": "2026-03-15", - "type": "chat" - }, - { - "id": "openai/gpt-audio-mini", - "name": "OpenAI: GPT Audio Mini", - "display_name": "OpenAI: GPT Audio Mini", - "modalities": { - "input": [ - "audio", - "text" - ], - "output": [ - "audio", - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-20", - "last_updated": "2026-03-15", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "display_name": "OpenAI: o3 Mini High", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "pdf", - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -136460,109 +141120,169 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-01-31", - "last_updated": "2026-03-15", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-4o-mini-2024-07-18", - "name": "OpenAI: GPT-4o-mini (2024-07-18)", - "display_name": "OpenAI: GPT-4o-mini (2024-07-18)", + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4 ($$$$)", + "display_name": "Anthropic: Claude Opus 4 ($$$$)", "modalities": { "input": [ "image", - "pdf", - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2026-03-15", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "display_name": "OpenAI: GPT-4.1 Nano", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2026-03-15", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "display_name": "OpenAI: gpt-oss-20b", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136573,27 +141293,30 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "display_name": "OpenAI: gpt-oss-safeguard-20b", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -136601,59 +141324,81 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "display_name": "OpenAI: o3 Mini", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "pdf", - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2024-12-20", - "last_updated": "2026-03-15", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "OpenAI: GPT-5.5", - "display_name": "OpenAI: GPT-5.5", + "id": "anthropic/claude-opus-4.7-fast", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -136665,77 +141410,85 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-05-01", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-0613", - "name": "OpenAI: GPT-3.5 Turbo (older v0613)", - "display_name": "OpenAI: GPT-3.5 Turbo (older v0613)", + "id": "z-ai/glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 4095, - "output": 4096 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2023-06-13", - "last_updated": "2023-06-13", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "display_name": "OpenAI: o3 Pro", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -136743,10 +141496,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -136755,31 +141508,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "display_name": "OpenAI: GPT-4o-mini", + "id": "z-ai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -136787,28 +141535,28 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-07-18", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "display_name": "OpenAI: GPT-5", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -136816,10 +141564,10 @@ ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -136827,68 +141575,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "openai/gpt-audio", - "name": "OpenAI: GPT Audio", - "display_name": "OpenAI: GPT Audio", + "id": "z-ai/glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "audio", "text" ], "output": [ - "audio", "text" ] }, "limit": { - "context": 128000, + "context": 202752, "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-20", - "last_updated": "2026-03-15", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "display_name": "OpenAI: o4 Mini Deep Research", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -136896,8 +141631,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -136907,32 +141642,21 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2024-06-26", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "display_name": "OpenAI: o4 Mini High", + "id": "z-ai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -136940,9 +141664,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 202752, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -136950,32 +141675,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-17", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "display_name": "OpenAI: o3 Deep Research", + "id": "z-ai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -136983,8 +141698,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -136992,73 +141707,60 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2024-06-26", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-5.1-chat", - "name": "OpenAI: GPT-5.1 Chat", - "display_name": "OpenAI: GPT-5.1 Chat", + "id": "z-ai/glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 65536, "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2026-03-15", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "display_name": "OpenAI: GPT-5 Codex", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 202752, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -137067,34 +141769,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "display_name": "OpenAI: GPT-3.5 Turbo", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -137104,82 +141797,89 @@ ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "OpenAI: GPT-4o (2024-05-13)", - "display_name": "OpenAI: GPT-4o (2024-05-13)", + "id": "z-ai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "image", - "pdf", - "text" + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2024-05-13", - "last_updated": "2026-03-15", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "OpenAI: GPT-4o (2024-11-20)", - "display_name": "OpenAI: GPT-4o (2024-11-20)", + "id": "perplexity/sonar-pro-search", + "name": "Perplexity: Sonar Pro Search", + "display_name": "Perplexity: Sonar Pro Search", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2024-11-20", - "last_updated": "2026-03-15", + "release_date": "2025-10-30", + "last_updated": "2025-10-30", "type": "chat" }, { - "id": "openai/gpt-4o-search-preview", - "name": "OpenAI: GPT-4o Search Preview", - "display_name": "OpenAI: GPT-4o Search Preview", + "id": "perplexity/sonar-deep-research", + "name": "Perplexity: Sonar Deep Research", + "display_name": "Perplexity: Sonar Deep Research", "modalities": { "input": [ "text" @@ -137190,102 +141890,80 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 25600 }, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-03-13", - "last_updated": "2026-03-15", + "release_date": "2025-03-07", + "last_updated": "2025-03-07", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "OpenAI: GPT-5.4", - "display_name": "OpenAI: GPT-5.4", + "id": "perplexity/sonar", + "name": "Perplexity: Sonar", + "display_name": "Perplexity: Sonar", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 127072, + "output": 25415 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-06", - "last_updated": "2026-03-15", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" }, { - "id": "openai/gpt-5.2-chat", - "name": "OpenAI: GPT-5.2 Chat", - "display_name": "OpenAI: GPT-5.2 Chat", + "id": "perplexity/sonar-pro", + "name": "Perplexity: Sonar Pro", + "display_name": "Perplexity: Sonar Pro", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 8000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2026-03-15", + "release_date": "2025-03-07", + "last_updated": "2025-03-07", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "OpenAI: GPT-5.2-Codex", - "display_name": "OpenAI: GPT-5.2-Codex", + "id": "perplexity/sonar-reasoning-pro", + "name": "Perplexity: Sonar Reasoning Pro", + "display_name": "Perplexity: Sonar Reasoning Pro", "modalities": { "input": [ "text", @@ -137296,140 +141974,115 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 25600 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "release_date": "2025-03-07", + "last_updated": "2025-03-07", "type": "chat" }, { - "id": "openai/gpt-4-1106-preview", - "name": "OpenAI: GPT-4 Turbo (older v1106)", - "display_name": "OpenAI: GPT-4 Turbo (older v1106)", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "OpenAI: GPT-5.4 Nano", - "display_name": "OpenAI: GPT-5.4 Nano", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-04-11", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "display_name": "OpenAI: GPT-5 Pro", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -137437,33 +142090,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2026-03-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "OpenAI: GPT-5.4 Mini", - "display_name": "OpenAI: GPT-5.4 Mini", + "id": "moonshotai/kimi-k2", + "name": "MoonshotAI: Kimi K2 0711", + "display_name": "MoonshotAI: Kimi K2 0711", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -137471,47 +142113,24 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 100352 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-17", - "last_updated": "2026-04-11", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b", - "display_name": "OpenAI: gpt-oss-120b", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -137521,8 +142140,8 @@ ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 262144, + "output": 100352 }, "temperature": true, "tool_call": true, @@ -137532,50 +142151,62 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "display_name": "OpenAI: GPT-3.5 Turbo 16k", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2023-08-28", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/o1", - "name": "OpenAI: o1", - "display_name": "OpenAI: o1", + "id": "moonshotai/kimi-k2-0905", + "name": "MoonshotAI: Kimi K2 0905", + "display_name": "MoonshotAI: Kimi K2 0905", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -137583,44 +142214,29 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 100352 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-12-05", - "last_updated": "2026-03-15", + "release_date": "2025-09-04", + "last_updated": "2025-09-04", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "OpenAI: GPT-5.2", - "display_name": "OpenAI: GPT-5.2", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ "image", - "pdf", - "text" + "text", + "pdf" ], "output": [ "text" @@ -137646,8 +142262,7 @@ "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -137660,18 +142275,20 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2026-03-15", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "OpenAI: GPT-5.3-Codex", - "display_name": "OpenAI: GPT-5.3-Codex", + "id": "openai/gpt-chat-latest", + "name": "OpenAI: GPT Chat Latest", + "display_name": "OpenAI: GPT Chat Latest", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" @@ -137681,47 +142298,31 @@ "context": 400000, "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-25", - "last_updated": "2026-03-15", + "release_date": "2026-05-05", + "last_updated": "2026-05-05", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "display_name": "OpenAI: GPT-5 Mini", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ "image", - "pdf", - "text" + "text", + "pdf" ], "output": [ "text" @@ -137742,12 +142343,11 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", - "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -137760,148 +142360,141 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2026-03-15", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "openai/gpt-5.3-chat", - "name": "OpenAI: GPT-5.3 Chat", - "display_name": "OpenAI: GPT-5.3 Chat", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-04", - "last_updated": "2026-03-15", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "display_name": "OpenAI: o1-pro", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1047576, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-03-19", - "last_updated": "2026-03-15", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "display_name": "OpenAI: GPT-5 Image", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ - "image", "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-10-14", - "last_updated": "2026-03-15", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "OpenAI: GPT-5.1", - "display_name": "OpenAI: GPT-5.1", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", - "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -137914,77 +142507,24 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2026-03-15", - "type": "chat" - }, - { - "id": "openai/gpt-4-turbo-preview", - "name": "OpenAI: GPT-4 Turbo Preview", - "display_name": "OpenAI: GPT-4 Turbo Preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2026-03-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "display_name": "OpenAI: GPT-4 Turbo", + "id": "openai/gpt-audio-mini", + "name": "OpenAI: GPT Audio Mini", + "display_name": "OpenAI: GPT Audio Mini", "modalities": { "input": [ "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2023-09-13", - "last_updated": "2024-04-09", - "type": "chat" - }, - { - "id": "openai/gpt-4o-2024-08-06", - "name": "OpenAI: GPT-4o (2024-08-06)", - "display_name": "OpenAI: GPT-4o (2024-08-06)", - "modalities": { - "input": [ - "image", - "pdf", - "text" + "audio", + "pdf" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { @@ -137998,47 +142538,47 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-08-06", - "last_updated": "2026-03-15", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai/gpt-5.4-image-2", - "name": "OpenAI: GPT-5.4 Image 2", - "display_name": "OpenAI: GPT-5.4 Image 2", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "image", "text", + "image", "pdf" ], "output": [ - "image", "text" ] }, "limit": { - "context": 272000, + "context": 1050000, "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -138051,47 +142591,41 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-05-01", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "OpenAI: GPT-5.1-Codex", - "display_name": "OpenAI: GPT-5.1-Codex", + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "display_name": "OpenAI: o3 Mini High", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -138101,18 +142635,75 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2025-02-12", + "last_updated": "2025-02-12", + "type": "chat" + }, + { + "id": "openai/gpt-4o-mini-2024-07-18", + "name": "OpenAI: GPT-4o-mini (2024-07-18)", + "display_name": "OpenAI: GPT-4o-mini (2024-07-18)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "type": "chat" + }, + { + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", + "modalities": { + "input": [ + "image", + "text", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "display_name": "OpenAI: GPT-5 Nano", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "image", - "pdf", "text" ], "output": [ @@ -138120,10 +142711,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -138131,35 +142722,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2026-03-15", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-4o-mini-search-preview", - "name": "OpenAI: GPT-4o-mini Search Preview", - "display_name": "OpenAI: GPT-4o-mini Search Preview", + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "display_name": "OpenAI: gpt-oss-safeguard-20b", "modalities": { "input": [ "text" @@ -138169,29 +142744,29 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "release_date": "2025-01", - "last_updated": "2025-01", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "openai/o3", - "name": "OpenAI: o3", - "display_name": "OpenAI: o3", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "pdf" ], "output": [ "text" @@ -138223,85 +142798,110 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2026-03-15", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "display_name": "OpenAI: GPT-3.5 Turbo Instruct", + "id": "openai/gpt-5.6-sol-pro", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 4095, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2023-03-01", - "last_updated": "2023-09-21", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "display_name": "OpenAI: GPT-5 Image Mini", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ + "text", "image", - "pdf", - "text" + "pdf" ], "output": [ - "image", "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2025-10-16", - "last_updated": "2026-03-15", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "display_name": "OpenAI: GPT-4.1", + "id": "openai/gpt-3.5-turbo-0613", + "name": "OpenAI: GPT-3.5 Turbo (older v0613)", + "display_name": "OpenAI: GPT-3.5 Turbo (older v0613)", "modalities": { "input": [ - "image", - "pdf", - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 4095, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -138310,19 +142910,19 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2026-03-15", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "display_name": "OpenAI: o4 Mini", + "id": "openai/o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ - "image", + "text", "pdf", - "text" + "image" ], "output": [ "text" @@ -138354,45 +142954,50 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2026-03-15", + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "openai/gpt-4-0314", - "name": "OpenAI: GPT-4 (older v0314)", - "display_name": "OpenAI: GPT-4 (older v0314)", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8191, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2023-05-28", - "last_updated": "2026-03-15", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "OpenAI: GPT-5.1-Codex-Max", - "display_name": "OpenAI: GPT-5.1-Codex-Max", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -138406,16 +143011,16 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high" @@ -138431,213 +143036,265 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "display_name": "OpenAI: GPT-4", + "id": "openai/gpt-audio", + "name": "OpenAI: GPT Audio", + "display_name": "OpenAI: GPT Audio", "modalities": { "input": [ - "text" + "text", + "audio", + "pdf" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 8191, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2023-03-14", - "last_updated": "2024-04-09", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai/gpt-4o-audio-preview", - "name": "OpenAI: GPT-4o Audio", - "display_name": "OpenAI: GPT-4o Audio", + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "display_name": "OpenAI: o4 Mini High", "modalities": { "input": [ - "audio", - "text" + "image", + "text", + "pdf" ], "output": [ - "audio", "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-08-15", - "last_updated": "2026-03-15", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "baidu/ernie-4.5-21b-a3b", - "name": "Baidu: ERNIE 4.5 21B A3B", - "display_name": "Baidu: ERNIE 4.5 21B A3B", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 8000 + "context": 16385, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "attachment": true, + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "baidu/ernie-4.5-vl-424b-a47b", - "name": "Baidu: ERNIE 4.5 VL 424B A47B ", - "display_name": "Baidu: ERNIE 4.5 VL 424B A47B ", + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 123000, - "output": 16000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2026-01", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "baidu/cobuddy:free", - "name": "Baidu: CoBuddy (free)", - "display_name": "Baidu: CoBuddy (free)", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-06", - "last_updated": "2026-05-07", + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "baidu/ernie-4.5-21b-a3b-thinking", - "name": "Baidu: ERNIE 4.5 21B A3B Thinking", - "display_name": "Baidu: ERNIE 4.5 21B A3B Thinking", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-19", - "last_updated": "2025-09-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "baidu/ernie-4.5-vl-28b-a3b", - "name": "Baidu: ERNIE 4.5 VL 28B A3B", - "display_name": "Baidu: ERNIE 4.5 VL 28B A3B", + "id": "openai/gpt-5.6-luna-pro", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 30000, - "output": 8000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "baidu/qianfan-ocr-fast", - "name": "Baidu: Qianfan-OCR-Fast", - "display_name": "Baidu: Qianfan-OCR-Fast", + "id": "openai/gpt-5.2-chat", + "name": "OpenAI: GPT-5.2 Chat (retires Aug 10)", + "display_name": "OpenAI: GPT-5.2 Chat (retires Aug 10)", "modalities": { "input": [ + "pdf", "image", "text" ], @@ -138646,80 +143303,79 @@ ] }, "limit": { - "context": 65536, - "output": 28672 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-05-16", - "type": "chat" - }, - { - "id": "baidu/ernie-4.5-300b-a47b", - "name": "Baidu: ERNIE 4.5 300B A47B ", - "display_name": "Baidu: ERNIE 4.5 300B A47B ", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 123000, - "output": 12000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2026-01", + "release_date": "2025-12-10", + "last_updated": "2025-12-10", "type": "chat" }, { - "id": "meta-llama/llama-3.1-70b-instruct", - "name": "Meta: Llama 3.1 70B Instruct", - "display_name": "Meta: Llama 3.1 70B Instruct", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 26215 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-16", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "meta-llama/llama-guard-4-12b", - "name": "Meta: Llama Guard 4 12B", - "display_name": "Meta: Llama Guard 4 12B", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ + "pdf", "image", "text" ], @@ -138728,80 +143384,98 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "meta-llama/llama-3-70b-instruct", - "name": "Meta: Llama 3 70B Instruct", - "display_name": "Meta: Llama 3 70B Instruct", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8000 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" - }, - { - "id": "meta-llama/llama-3.2-1b-instruct", - "name": "Meta: Llama 3.2 1B Instruct", - "display_name": "Meta: Llama 3.2 1B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 60000, - "output": 12000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2026-01-27", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "meta-llama/llama-3-8b-instruct", - "name": "Meta: Llama 3 8B Instruct", - "display_name": "Meta: Llama 3 8B Instruct", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ + "pdf", + "image", "text" ], "output": [ @@ -138809,24 +143483,48 @@ ] }, "limit": { - "context": 8192, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-04-25", - "last_updated": "2025-04-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Meta: Llama 3.3 70B Instruct", - "display_name": "Meta: Llama 3.3 70B Instruct", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -138837,35 +143535,41 @@ }, "limit": { "context": 131072, - "output": 16384 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-08-01", - "last_updated": "2026-02-04", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta-llama/llama-4-maverick", - "name": "Meta: Llama 4 Maverick", - "display_name": "Meta: Llama 4 Maverick", + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "display_name": "OpenAI: GPT-3.5 Turbo 16k", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 16385, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -138873,72 +143577,118 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-05", - "last_updated": "2025-12-24", + "open_weights": false, + "release_date": "2023-08-28", + "last_updated": "2023-08-28", "type": "chat" }, { - "id": "meta-llama/llama-4-scout", - "name": "Meta: Llama 4 Scout", - "display_name": "Meta: Llama 4 Scout", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 327680, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "meta-llama/llama-3.2-3b-instruct", - "name": "Meta: Llama 3.2 3B Instruct", - "display_name": "Meta: Llama 3.2 3B Instruct", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 80000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Meta: Llama 3.1 8B Instruct", - "display_name": "Meta: Llama 3.1 8B Instruct", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ + "pdf", + "image", "text" ], "output": [ @@ -138946,655 +143696,902 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2025-12-23", - "type": "chat" - }, - { - "id": "meta-llama/llama-guard-3-8b", - "name": "Llama Guard 3 8B", - "display_name": "Llama Guard 3 8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 26215 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-04-18", - "last_updated": "2026-02-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "meta-llama/llama-3.2-11b-vision-instruct", - "name": "Meta: Llama 3.2 11B Vision Instruct", - "display_name": "Meta: Llama 3.2 11B Vision Instruct", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "arcee-ai/trinity-mini", - "name": "Arcee AI: Trinity Mini", - "display_name": "Arcee AI: Trinity Mini", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12", - "last_updated": "2026-01-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "arcee-ai/virtuoso-large", - "name": "Arcee AI: Virtuoso Large", - "display_name": "Arcee AI: Virtuoso Large", + "id": "openai/gpt-5.3-chat", + "name": "OpenAI: GPT-5.3 Chat (retires Aug 10)", + "display_name": "OpenAI: GPT-5.3 Chat (retires Aug 10)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 64000 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-06", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "arcee-ai/spotlight", - "name": "Arcee AI: Spotlight", - "display_name": "Arcee AI: Spotlight", + "id": "openai/o1-pro", + "name": "o1-pro", + "display_name": "o1-pro", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65537 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-05-06", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2025-03-19", + "last_updated": "2025-03-19", "type": "chat" }, { - "id": "arcee-ai/trinity-large-thinking", - "name": "Arcee AI: Trinity Large Thinking", - "display_name": "Arcee AI: Trinity Large Thinking", + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image ($$$$)", + "display_name": "OpenAI: GPT-5 Image ($$$$)", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ + "image", "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-04-11", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-14", + "last_updated": "2025-10-14", "type": "chat" }, { - "id": "arcee-ai/coder-large", - "name": "Arcee AI: Coder Large", - "display_name": "Arcee AI: Coder Large", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-06", - "last_updated": "2026-03-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "arcee-ai/maestro-reasoning", - "name": "Arcee AI: Maestro Reasoning", - "display_name": "Arcee AI: Maestro Reasoning", + "id": "openai/gpt-4-turbo-preview", + "name": "OpenAI: GPT-4 Turbo Preview ($$$$)", + "display_name": "OpenAI: GPT-4 Turbo Preview ($$$$)", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-06", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", "type": "chat" }, { - "id": "bytedance-seed/seed-1.6", - "name": "ByteDance Seed: Seed 1.6", - "display_name": "ByteDance Seed: Seed 1.6", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ - "image", "text", - "video" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-mini", - "name": "ByteDance Seed: Seed-2.0-Mini", - "display_name": "ByteDance Seed: Seed-2.0-Mini", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ - "image", "text", - "video" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-27", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "bytedance-seed/seed-1.6-flash", - "name": "ByteDance Seed: Seed 1.6 Flash", - "display_name": "ByteDance Seed: Seed 1.6 Flash", + "id": "openai/gpt-5.4-image-2", + "name": "OpenAI: GPT-5.4 Image 2", + "display_name": "OpenAI: GPT-5.4 Image 2", "modalities": { "input": [ "image", "text", - "video" + "pdf" ], "output": [ + "image", "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 272000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2026-03-15", + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-lite", - "name": "ByteDance Seed: Seed-2.0-Lite", - "display_name": "ByteDance Seed: Seed-2.0-Lite", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ - "image", "text", - "video" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-10", - "last_updated": "2026-03-15", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "kilo-auto/balanced", - "name": "Kilo Auto Balanced", - "display_name": "Kilo Auto Balanced", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kilo-auto/small", - "name": "Kilo Auto Small", - "display_name": "Kilo Auto Small", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "kilo-auto/free", - "name": "Kilo Auto Free", - "display_name": "Kilo Auto Free", + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "display_name": "OpenAI: GPT-3.5 Turbo Instruct", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 4095, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "release_date": "2023-09-28", + "last_updated": "2023-09-28", "type": "chat" }, { - "id": "kilo-auto/frontier", - "name": "Kilo Auto Frontier", - "display_name": "Kilo Auto Frontier", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "stepfun/step-3.5-flash", - "name": "StepFun: Step 3.5 Flash", - "display_name": "StepFun: Step 3.5 Flash", + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "display_name": "OpenAI: GPT-5 Image Mini", "modalities": { "input": [ + "pdf", + "image", "text" ], "output": [ + "image", "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-01-29", - "last_updated": "2026-01-29", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-16", + "last_updated": "2025-10-16", "type": "chat" }, { - "id": "anthracite-org/magnum-v4-72b", - "name": "Magnum v4 72B", - "display_name": "Magnum v4 72B", + "id": "openai/gpt-5.6-terra-pro", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 2048 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-10-22", - "last_updated": "2026-03-15", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "merge-gateway": { - "id": "merge-gateway", - "name": "Merge Gateway", - "display_name": "Merge Gateway", - "doc": "https://docs.merge.dev/merge-gateway", - "models": [ + }, { - "id": "cohere/command-r-08-2024", - "name": "Command R 08-2024", - "display_name": "Command R 08-2024", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "cohere/command-a-03-2025", - "name": "Command A 03-2025", - "display_name": "Command A 03-2025", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Command R+ 08-2024", - "display_name": "Command R+ 08-2024", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "cohere/command-r7b-12-2024", - "name": "Command R7B 12-2024", - "display_name": "Command R7B 12-2024", + "id": "openai/gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 8191, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-02", - "last_updated": "2024-12-02", + "attachment": true, + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "nvidia/nemotron-nano-9b-v2", - "name": "Nemotron Nano 9B", - "display_name": "Nemotron Nano 9B", + "id": "baidu/ernie-4.5-vl-424b-a47b", + "name": "Baidu: ERNIE 4.5 VL 424B A47B ", + "display_name": "Baidu: ERNIE 4.5 VL 424B A47B ", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -139602,8 +144599,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 123000, + "output": 16000 }, "temperature": true, "tool_call": false, @@ -139611,195 +144608,126 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "meta-llama/llama-3.1-70b-instruct", + "name": "Meta: Llama 3.1 70B Instruct", + "display_name": "Meta: Llama 3.1 70B Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "meta-llama/llama-guard-4-12b", + "name": "Meta: Llama Guard 4 12B", + "display_name": "Meta: Llama Guard 4 12B", "modalities": { "input": [ - "text", "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 163840, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2025-04-30", + "last_updated": "2025-04-30", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Meta: Llama 3.2 1B Instruct", + "display_name": "Meta: Llama 3.2 1B Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 60000, + "output": 60000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "meta-llama/llama-4-maverick", + "name": "Meta: Llama 4 Maverick", + "display_name": "Meta: Llama 4 Maverick", "modalities": { "input": [ "text", @@ -139811,93 +144739,51 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "meta-llama/llama-4-scout", + "name": "Meta: Llama 4 Scout", + "display_name": "Meta: Llama 4 Scout", "modalities": { "input": [ "text", - "image", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 327680, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B-A4B", - "display_name": "Gemma 4 26B-A4B", + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Meta: Llama 3.2 3B Instruct", + "display_name": "Meta: Llama 3.2 3B Instruct", "modalities": { "input": [ "text" @@ -139907,30 +144793,24 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "google/gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Meta: Llama 3.1 8B Instruct", + "display_name": "Meta: Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -139940,62 +144820,51 @@ ] }, "limit": { - "context": 2048, - "output": 4096 + "context": 131072, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash-Lite", - "display_name": "Gemini 3.1 Flash-Lite", + "id": "arcee-ai/virtuoso-large", + "name": "Arcee AI: Virtuoso Large", + "display_name": "Arcee AI: Virtuoso Large", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2025-05-05", + "last_updated": "2025-05-05", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "arcee-ai/trinity-large-thinking", + "name": "Arcee AI: Trinity Large Thinking", + "display_name": "Arcee AI: Trinity Large Thinking", "modalities": { "input": [ "text" @@ -140006,43 +144875,37 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "bytedance-seed/seed-1.6", + "name": "ByteDance Seed: Seed 1.6", + "display_name": "ByteDance Seed: Seed 1.6", "modalities": { "input": [ - "text", "image", - "audio", - "pdf" + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -140050,49 +144913,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "bytedance-seed/seed-2.0-mini", + "name": "ByteDance Seed: Seed-2.0-Mini", + "display_name": "ByteDance Seed: Seed-2.0-Mini", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -140102,29 +144945,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-02-26", + "last_updated": "2026-02-26", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "bytedance-seed/seed-1.6-flash", + "name": "ByteDance Seed: Seed 1.6 Flash", + "display_name": "ByteDance Seed: Seed 1.6 Flash", "modalities": { "input": [ - "text", "image", - "audio", - "pdf" + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -140132,92 +144973,50 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "google/gemini-3-pro-preview", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "bytedance-seed/seed-2.0-lite", + "name": "ByteDance Seed: Seed-2.0-Lite", + "display_name": "ByteDance Seed: Seed-2.0-Lite", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "context": 262144, + "output": 131072 }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "release_date": "2026-03-10", + "last_updated": "2026-03-10", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "kilo-auto/balanced", + "name": "Auto Balanced", + "display_name": "Auto Balanced", "modalities": { "input": [ "text", - "image", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -140231,38 +145030,18 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "kilo-auto/small", + "name": "Auto Small", + "display_name": "Auto Small", "modalities": { "input": [ "text", @@ -140273,10 +145052,10 @@ ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -140284,14 +145063,14 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "qwen/qwen3-coder-480b-a35b-instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "kilo-auto/free", + "name": "Auto Free", + "display_name": "Auto Free", "modalities": { "input": [ "text" @@ -140301,30 +145080,30 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 10000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "kilo-auto/frontier", + "name": "Auto Frontier", + "display_name": "Auto Frontier", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -140332,30 +145111,24 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "qwen/qwen3-vl-plus", - "name": "Qwen3-VL Plus", - "display_name": "Qwen3-VL Plus", + "id": "kilo-auto/efficient", + "name": "Auto Efficient", + "display_name": "Auto Efficient", "modalities": { "input": [ "text", @@ -140366,48 +145139,37 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "stepfun/step-3.7-flash:free", + "name": "StepFun: Step 3.7 Flash (free)", + "display_name": "StepFun: Step 3.7 Flash (free)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -140415,28 +145177,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "stepfun/step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ "text" @@ -140450,112 +145201,116 @@ "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "stepfun/step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 256000, + "output": 256000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "attachment": true, + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "display_name": "Magnum v4 72B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 16384, + "output": 2048 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "type": "chat" + } + ] + }, + "merge-gateway": { + "id": "merge-gateway", + "name": "Merge Gateway", + "display_name": "Merge Gateway", + "doc": "https://docs.merge.dev/merge-gateway", + "models": [ + { + "id": "cohere/command-r-08-2024", + "name": "Command R 08-2024", + "display_name": "Command R 08-2024", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 128000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "cohere/command-a-03-2025", + "name": "Command A 03-2025", + "display_name": "Command A 03-2025", "modalities": { "input": [ "text" @@ -140565,30 +145320,25 @@ ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 256000, + "output": 8000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen3-Next 80B-A3B (Thinking)", - "display_name": "Qwen3-Next 80B-A3B (Thinking)", + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+ 08-2024", + "display_name": "Command R+ 08-2024", "modalities": { "input": [ "text" @@ -140598,89 +145348,64 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "cohere/command-r7b-12-2024", + "name": "Command R7B 12-2024", + "display_name": "Command R7B 12-2024", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-06-01", + "release_date": "2024-12-02", + "last_updated": "2024-12-02", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "nvidia/nemotron-nano-9b-v2", + "name": "Nemotron Nano 9B", + "display_name": "Nemotron Nano 9B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -140690,253 +145415,276 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B", - "display_name": "Qwen3.5 35B A3B", + "id": "google/gemini-2.5-computer-use-preview-10-2025", + "name": "Gemini 2.5 Computer Use Preview (10-2025)", + "display_name": "Gemini 2.5 Computer Use Preview (10-2025)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-10-07", + "last_updated": "2025-10-07", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen3 235B A22B", - "display_name": "Qwen3 235B A22B", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash-Lite", + "display_name": "Gemini 3.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -140944,39 +145692,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -140984,24 +145743,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B", + "display_name": "Gemma 4 26B A4B", "modalities": { "input": [ "text" @@ -141011,8 +145777,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": false, @@ -141022,25 +145788,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "google/gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ "text" @@ -141050,51 +145810,43 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 2048, + "output": 4096 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -141102,64 +145854,70 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash-Lite", + "display_name": "Gemini 3.1 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B It", + "display_name": "Gemma 4 31B It", "modalities": { "input": [ "text" @@ -141169,91 +145927,110 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "bytedance/dola-seed-2.0-lite", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", + "id": "google/gemini-3.1-flash-image", + "name": "Gemini 3.1 Flash Image", + "display_name": "Gemini 3.1 Flash Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 131072, + "context": 32768, "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-28", - "last_updated": "2026-02-28", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "bytedance/dola-seed-2.0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "google/gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image", + "display_name": "Gemini 2.5 Flash Image", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "imageGeneration" }, { - "id": "bytedance/dola-seed-2.0-pro", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "google/gemini-3-pro-image", + "name": "Gemini 3 Pro Image", + "display_name": "Gemini 3 Pro Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": false, @@ -141261,84 +146038,133 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "imageGeneration" }, { - "id": "bytedance/dola-seed-2.0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "bytedance/dola-seed-2.0-code-preview", - "name": "Dola Seed 2.0 Code (preview)", - "display_name": "Dola Seed 2.0 Code (preview)", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "moonshot/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -141347,39 +146173,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-01", - "last_updated": "2026-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -141388,107 +146225,110 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", @@ -141499,30 +146339,25 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1000000, + "output": 250000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "meta/llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ "text" @@ -141536,21 +146371,21 @@ "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -141562,7 +146397,7 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -141577,14 +146412,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "xai/grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 Non-Reasoning", - "display_name": "Grok 4.20 Non-Reasoning", + "id": "qwen/qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "display_name": "Qwen3-VL Plus", "modalities": { "input": [ "text", @@ -141595,36 +146431,48 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "qwen/qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -141634,31 +146482,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "xai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -141668,23 +146522,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "xai/grok-4.20-0309-reasoning", - "name": "Grok 4.20", - "display_name": "Grok 4.20", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -141692,7 +146551,7 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 250000 }, "temperature": true, "tool_call": true, @@ -141700,45 +146559,67 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "mistral/pixtral-large-latest", - "name": "Pixtral Large (latest)", - "display_name": "Pixtral Large (latest)", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2024-11-04", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistral/magistral-medium-latest", - "name": "Magistral Medium (latest)", - "display_name": "Magistral Medium (latest)", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -141748,8 +146629,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -141757,17 +146638,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-20", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "mistral/mistral-large-2411", - "name": "Mistral Large 2.1", - "display_name": "Mistral Large 2.1", + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "display_name": "Qwen3-Next 80B-A3B (Thinking)", "modalities": { "input": [ "text" @@ -141778,24 +146663,36 @@ }, "limit": { "context": 131072, - "output": 16384 + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-18", - "last_updated": "2024-11-18", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "mistral/mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", @@ -141807,7 +146704,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -141815,16 +146712,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistral/devstral-small-2507", - "name": "Devstral Small", - "display_name": "Devstral Small", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text" @@ -141834,54 +146742,36 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-07-10", - "last_updated": "2025-07-10", - "type": "chat" - }, - { - "id": "mistral/mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "mistral/mistral-small-latest", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B", + "display_name": "Qwen3.5 35B A3B", "modalities": { "input": [ "text", @@ -141893,7 +146783,7 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -141901,17 +146791,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistral/codestral-latest", - "name": "Codestral (latest)", - "display_name": "Codestral (latest)", + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen3 235B A22B", + "display_name": "Qwen3 235B A22B", "modalities": { "input": [ "text" @@ -141921,25 +146821,37 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-05-29", - "last_updated": "2025-01-04", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "mistral/devstral-medium-latest", - "name": "Devstral 2 (latest)", - "display_name": "Devstral 2 (latest)", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -141950,24 +146862,35 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "mistral/devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -141977,8 +146900,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -141986,16 +146909,16 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "mistral/mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", @@ -142006,25 +146929,30 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "mistral/devstral-medium-2507", - "name": "Devstral Medium", - "display_name": "Devstral Medium", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -142034,8 +146962,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -142044,44 +146972,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-07-10", - "last_updated": "2025-07-10", - "type": "chat" - }, - { - "id": "mistral/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax M2.7 Highspeed", - "display_name": "MiniMax M2.7 Highspeed", + "id": "qwen/qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ "text" @@ -142091,8 +146990,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -142112,15 +147011,16 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -142130,8 +147030,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -142151,82 +147051,16 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" - }, - { - "id": "minimax/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", - "type": "chat" - }, - { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax M2.5 Highspeed", - "display_name": "MiniMax M2.5 Highspeed", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text" @@ -142236,8 +147070,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -142247,19 +147081,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text" @@ -142269,8 +147109,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -142280,19 +147120,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "qwen/qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -142302,8 +147148,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -142313,19 +147159,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text" @@ -142336,7 +147189,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 250000 }, "temperature": true, "tool_call": true, @@ -142356,16 +147209,16 @@ } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B", + "display_name": "Qwen3.5 122B A10B", "modalities": { "input": [ "text" @@ -142375,8 +147228,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -142397,15 +147250,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -142415,37 +147267,25 @@ ] }, "limit": { - "context": 163840, - "output": 40960 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "writer/palmyra-x4", - "name": "Palmyra X4", - "display_name": "Palmyra X4", + "id": "bytedance/dola-seed-2.0-lite", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ "text" @@ -142455,24 +147295,24 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-10-09", - "last_updated": "2024-10-09", + "release_date": "2026-02-28", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "writer/palmyra-x5", - "name": "Palmyra X5", - "display_name": "Palmyra X5", + "id": "bytedance/dola-seed-2.0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ "text", @@ -142483,205 +147323,118 @@ ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 256000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "bytedance/dola-seed-2.0-pro", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "anthropic/claude-3-7-sonnet-20250219", - "name": "Claude 3.7 Sonnet", - "display_name": "Claude 3.7 Sonnet", + "id": "bytedance/dola-seed-2.0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "bytedance/dola-seed-2.0-code-preview", + "name": "Dola Seed 2.0 Code (preview)", + "display_name": "Dola Seed 2.0 Code (preview)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "moonshot/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -142692,373 +147445,248 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "moonshot/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5 (20250929)", - "display_name": "Claude Sonnet 4.5 (20250929)", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5 (20251101)", - "display_name": "Claude Opus 4.5 (20251101)", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-01", - "last_updated": "2025-11-01", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5 (20251001)", - "display_name": "Claude Haiku 4.5 (20251001)", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-20250514", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "meta/llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -143066,9 +147694,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -143081,130 +147709,88 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4-20250514", - "name": "Claude Opus 4 (20250514)", - "display_name": "Claude Opus 4 (20250514)", + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 Non-Reasoning", + "display_name": "Grok 4.20 Non-Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "anthropic/claude-opus-4-1-20250805", - "name": "Claude Opus 4.1 (20250805)", - "display_name": "Claude Opus 4.1 (20250805)", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "xai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -143214,61 +147800,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini", - "display_name": "GPT-4.1 Mini", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20", + "display_name": "Grok 4.20", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "mistral/pixtral-large-latest", + "name": "Pixtral Large (latest)", + "display_name": "Pixtral Large (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -143276,7 +147853,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -143284,70 +147861,45 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2024-11-04", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "mistral/magistral-medium-latest", + "name": "Magistral Medium (latest)", + "display_name": "Magistral Medium (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", + "id": "mistral/mistral-large-2411", + "name": "Mistral Large 2.1", + "display_name": "Mistral Large 2.1", "modalities": { "input": [ "text" @@ -143357,55 +147909,54 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2024-11", + "release_date": "2024-11-18", + "last_updated": "2024-11-18", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 Nano", - "display_name": "GPT-4.1 Nano", + "id": "mistral/mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT-OSS 20B", - "display_name": "GPT-OSS 20B", + "id": "mistral/devstral-small-2507", + "name": "Devstral Small", + "display_name": "Devstral Small", "modalities": { "input": [ "text" @@ -143415,35 +147966,29 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2025-07-10", + "last_updated": "2025-07-10", "type": "chat" }, { - "id": "openai/gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat Latest", - "display_name": "GPT-5.2 Chat Latest", + "id": "mistral/mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -143451,201 +147996,110 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" - }, - { - "id": "openai/o3-mini", - "name": "o3 Mini", - "display_name": "o3 Mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "mistral/mistral-small-latest", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o Mini", - "display_name": "GPT-4o Mini", + "id": "mistral/codestral-latest", + "name": "Codestral (latest)", + "display_name": "Codestral (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-05-29", + "last_updated": "2025-01-04", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "mistral/devstral-medium-latest", + "name": "Devstral 2 (latest)", + "display_name": "Devstral 2 (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5 Turbo", - "display_name": "GPT-3.5 Turbo", + "id": "mistral/devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ "text" @@ -143655,38 +148109,37 @@ ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 256000, + "output": 256000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "GPT-4o (2024-05-13)", - "display_name": "GPT-4o (2024-05-13)", + "id": "mistral/mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -143694,21 +148147,19 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-5-chat-latest", - "name": "GPT-5 Chat Latest", - "display_name": "GPT-5 Chat Latest", + "id": "mistral/devstral-medium-2507", + "name": "Devstral Medium", + "display_name": "Devstral Medium", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -143716,37 +148167,36 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-05", + "release_date": "2025-07-10", + "last_updated": "2025-07-10", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "mistral/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -143754,205 +148204,161 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax M2.7 Highspeed", + "display_name": "MiniMax M2.7 Highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat Latest", - "display_name": "GPT-5.3 Chat Latest", + "id": "minimax/minimax-m2.7", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 204800, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "minimax/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "minimax/minimax-m2.5-highspeed", + "name": "MiniMax M2.5 Highspeed", + "display_name": "MiniMax M2.5 Highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "minimax/minimax-m2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ "text" @@ -143962,11 +148368,11 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 204800, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -143978,29 +148384,27 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "display_name": "MiniMax M2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 204800, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -144008,44 +148412,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -144053,106 +148445,72 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -144161,92 +148519,68 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "deepseek/deepseek-r1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 163840, + "output": 40960 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "writer/palmyra-x4", + "name": "Palmyra X4", + "display_name": "Palmyra X4", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -144254,54 +148588,50 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "release_date": "2024-10-09", + "last_updated": "2024-10-09", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "writer/palmyra-x5", + "name": "Palmyra X5", + "display_name": "Palmyra X5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -144313,52 +148643,58 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "anthropic/claude-3-7-sonnet-20250219", + "name": "Claude 3.7 Sonnet", + "display_name": "Claude 3.7 Sonnet", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -144366,39 +148702,45 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": false, + "summaries": false, + "visibility": "full", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic uses thinking budget tokens" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2024-10-31", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -144410,49 +148752,54 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -144464,25 +148811,52 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4 Mini", - "display_name": "o4 Mini", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -144494,68 +148868,104 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "anthropic/claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5 (20250929)", + "display_name": "Claude Sonnet 4.5 (20250929)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-5.1-chat-latest", - "name": "GPT-5.1 Chat Latest", - "display_name": "GPT-5.1 Chat Latest", + "id": "anthropic/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5 (20251101)", + "display_name": "Claude Opus 4.5 (20251101)", "modalities": { "input": [ "text", @@ -144567,28 +148977,58 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-05", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", "type": "chat" }, { - "id": "zai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "anthropic/claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5 (20251001)", + "display_name": "Claude Haiku 4.5 (20251001)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -144596,67 +149036,108 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "zai/glm-4.5-air", - "name": "GLM-4.5 Air", - "display_name": "GLM-4.5 Air", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "zai/glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "anthropic/claude-sonnet-4-20250514", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -144664,48 +149145,61 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "zai/glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -144716,88 +149210,110 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "zai/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "anthropic/claude-opus-4-20250514", + "name": "Claude Opus 4 (20250514)", + "display_name": "Claude Opus 4 (20250514)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "zai/glm-4.7-flashx", - "name": "GLM-4.7 FlashX", - "display_name": "GLM-4.7 FlashX", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "anthropic/claude-opus-4-1-20250805", + "name": "Claude Opus 4.1 (20250805)", + "display_name": "Claude Opus 4.1 (20250805)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -144805,30 +149321,46 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "zai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -144838,8 +149370,8 @@ ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -144847,100 +149379,103 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "zai/glm-4.5v", - "name": "Glm 4.5V", - "display_name": "Glm 4.5V", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "display_name": "GPT-4.1 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "zai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "zai/glm-5-turbo", - "name": "GLM-5 Turbo", - "display_name": "GLM-5 Turbo", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -144949,67 +149484,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" - } - ] - }, - "cloudferro-sherlock": { - "id": "cloudferro-sherlock", - "name": "CloudFerro Sherlock", - "display_name": "CloudFerro Sherlock", - "api": "https://api-sherlock.cloudferro.com/openai/v1/", - "doc": "https://docs.sherlock.cloudferro.com/", - "models": [ - { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 196000, - "output": 16000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "speakleash/Bielik-11B-v3.0-Instruct", - "name": "Bielik 11B v3.0 Instruct", - "display_name": "Bielik 11B v3.0 Instruct", + "id": "openai/gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", "modalities": { "input": [ "text" @@ -145019,53 +149524,55 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "speakleash/Bielik-11B-v2.6-Instruct", - "name": "Bielik 11B v2.6 Instruct", - "display_name": "Bielik 11B v2.6 Instruct", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 Nano", + "display_name": "GPT-4.1 Nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "OpenAI GPT OSS 120B", - "display_name": "OpenAI GPT OSS 120B", + "id": "openai/gpt-oss-20b", + "name": "GPT-OSS 20B", + "display_name": "GPT-OSS 20B", "modalities": { "input": [ "text" @@ -145075,11 +149582,11 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -145091,51 +149598,44 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "openai/gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat Latest", + "display_name": "GPT-5.2 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 70000, - "output": 70000 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10-09", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" - } - ] - }, - "subconscious": { - "id": "subconscious", - "name": "Subconscious", - "display_name": "Subconscious", - "api": "https://api.subconscious.dev/v1", - "doc": "https://docs.subconscious.dev", - "models": [ + }, { - "id": "subconscious/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/o3-mini", + "name": "o3 Mini", + "display_name": "o3 Mini", "modalities": { "input": [ "text" @@ -145145,10 +149645,10 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -145156,110 +149656,126 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "subconscious/tim-qwen3.6-27b", - "name": "TIM-Qwen3.6 27B", - "display_name": "TIM-Qwen3.6 27B", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 5000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - } - ] - }, - "tencent-coding-plan": { - "id": "tencent-coding-plan", - "name": "Tencent Coding Plan (China)", - "display_name": "Tencent Coding Plan (China)", - "api": "https://api.lkeap.cloud.tencent.com/coding/v3", - "doc": "https://cloud.tencent.com/document/product/1772/128947", - "models": [ + }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o Mini", + "display_name": "GPT-4o Mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, + "context": 128000, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -145268,25 +149784,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "hunyuan-2.0-instruct", - "name": "Tencent HY 2.0 Instruct", - "display_name": "Tencent HY 2.0 Instruct", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5 Turbo", + "display_name": "GPT-3.5 Turbo", "modalities": { "input": [ "text" @@ -145296,178 +149822,180 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 16385, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "hunyuan-2.0-thinking", - "name": "Tencent HY 2.0 Think", - "display_name": "Tencent HY 2.0 Think", + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "hunyuan-turbos", - "name": "Hunyuan-TurboS", - "display_name": "Hunyuan-TurboS", + "id": "openai/gpt-5-chat-latest", + "name": "GPT-5 Chat Latest", + "display_name": "GPT-5 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "hunyuan-t1", - "name": "Hunyuan-T1", - "display_name": "Hunyuan-T1", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "tc-code-latest", - "name": "Auto", - "display_name": "Auto", + "id": "openai/gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat Latest", + "display_name": "GPT-5.3 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, @@ -145475,91 +150003,123 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" - } - ] - }, - "hyper": { - "id": "hyper", - "name": "Charm Hyper", - "display_name": "Charm Hyper", - "api": "https://hyper.charm.land/v1", - "doc": "https://hyper.charm.land", - "models": [ + }, { - "id": "qwen3.7-flash", - "name": "Qwen3.7-Flash", - "display_name": "Qwen3.7-Flash", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-27", - "last_updated": "2026-07-30", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-15", - "last_updated": "2026-07-22", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ "text" @@ -145569,48 +150129,45 @@ ] }, "limit": { - "context": 202752, - "output": 20275 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-13", - "last_updated": "2026-07-22", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -145618,32 +150175,44 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-04", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -145652,220 +150221,366 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-06", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 26214 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-13", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 20480 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-05", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" + }, + { + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", + "type": "chat" + }, + { + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-28", - "last_updated": "2026-07-22", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3.6-max", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-05-20", - "last_updated": "2026-07-22", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -145873,62 +150588,83 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-07-03", - "last_updated": "2026-07-22", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 430000, - "output": 43000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2026-04-30", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "openai/o4-mini", + "name": "o4 Mini", + "display_name": "o4 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 512000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -145936,19 +150672,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-31", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "openai/gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ "text" @@ -145958,32 +150704,30 @@ ] }, "limit": { - "context": 256000, - "output": 25600 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-07-22", + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "openai/gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat Latest", + "display_name": "GPT-5.1 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -145991,24 +150735,24 @@ }, "limit": { "context": 128000, - "output": 12800 + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2026-04-30", - "last_updated": "2026-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -146018,8 +150762,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -146040,15 +150784,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-06", - "last_updated": "2026-07-22", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "zai/glm-4.5-air", + "name": "GLM-4.5 Air", + "display_name": "GLM-4.5 Air", "modalities": { "input": [ "text" @@ -146058,8 +150801,8 @@ ] }, "limit": { - "context": 131072, - "output": 13107 + "context": 128000, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -146067,127 +150810,129 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-04-13", - "last_updated": "2026-07-22", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "zai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-07-03", - "last_updated": "2026-07-22", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "zai/glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-20", - "last_updated": "2026-07-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "zai/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-27", - "last_updated": "2026-07-30", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct-int4-mixed-ar", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "zai/glm-4.7-flashx", + "name": "GLM-4.7 FlashX", + "display_name": "GLM-4.7 FlashX", "modalities": { "input": [ "text" @@ -146197,65 +150942,60 @@ ] }, "limit": { - "context": 106000, - "output": 10600 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-04-30", - "last_updated": "2026-07-22", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "zai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-05-20", - "last_updated": "2026-07-22", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "zai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -146265,75 +151005,67 @@ ] }, "limit": { - "context": 262144, - "output": 26214 + "context": 128000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-04-30", - "last_updated": "2026-07-22", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" - } - ] - }, - "alibaba": { - "id": "alibaba", - "name": "alibaba", - "display_name": "alibaba", - "api": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/models", - "models": [ + }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "zai/glm-4.5v", + "name": "Glm 4.5V", + "display_name": "Glm 4.5V", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "zai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -146343,43 +151075,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "qwen3-vl-plus", - "name": "Qwen3 VL Plus", - "display_name": "Qwen3 VL Plus", + "id": "zai/glm-5-turbo", + "name": "GLM-5 Turbo", + "display_name": "GLM-5 Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -146394,15 +151126,23 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" - }, + } + ] + }, + "scx": { + "id": "scx", + "name": "SCX.ai", + "display_name": "SCX.ai", + "api": "https://api.scx.ai/v1", + "doc": "https://platform.scx.ai/docs", + "models": [ { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -146412,19 +151152,14 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 192000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -146439,29 +151174,25 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -146471,25 +151202,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "cloudferro-sherlock": { + "id": "cloudferro-sherlock", + "name": "CloudFerro Sherlock", + "display_name": "CloudFerro Sherlock", + "api": "https://api-sherlock.cloudferro.com/openai/v1/", + "doc": "https://docs.sherlock.cloudferro.com/", + "models": [ { - "id": "qwen-mt-plus", - "name": "Qwen Mt Plus", - "display_name": "Qwen Mt Plus", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -146499,37 +151233,42 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 196000, + "output": 16000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01", - "last_updated": "2025-01", + "open_weights": true, + "knowledge": "2026-01", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen2-5-vl-72b-instruct", - "name": "Qwen2.5-VL 72B Instruct", - "display_name": "Qwen2.5-VL 72B Instruct", + "id": "speakleash/Bielik-11B-v3.0-Instruct", + "name": "Bielik 11B v3.0 Instruct", + "display_name": "Bielik 11B v3.0 Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 32000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -146538,15 +151277,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "knowledge": "2025-03", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "speakleash/Bielik-11B-v2.6-Instruct", + "name": "Bielik 11B v2.6 Instruct", + "display_name": "Bielik 11B v2.6 Instruct", "modalities": { "input": [ "text" @@ -146556,44 +151295,36 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 32000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "openai/gpt-oss-120b", + "name": "OpenAI GPT OSS 120B", + "display_name": "OpenAI GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -146603,41 +151334,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "qwen-omni-turbo", - "name": "Qwen-Omni Turbo", - "display_name": "Qwen-Omni Turbo", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 70000, + "output": 70000 }, "temperature": true, "tool_call": true, @@ -146645,89 +151365,152 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-19", - "last_updated": "2025-03-26", + "open_weights": true, + "knowledge": "2024-10-09", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" - }, + } + ] + }, + "modelis": { + "id": "modelis", + "name": "Modelis", + "display_name": "Modelis", + "api": "https://modelishub.com/v1", + "doc": "https://modelishub.com/pricing", + "models": [ { - "id": "qwen-vl-max", - "name": "Qwen-VL Max", - "display_name": "Qwen-VL Max", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-08", - "last_updated": "2025-08-13", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -146736,36 +151519,51 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b", - "name": "Qwen3-VL 235B-A22B", - "display_name": "Qwen3-VL 235B-A22B", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -146786,43 +151584,72 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen2-5-72b-instruct", - "name": "Qwen2.5 72B Instruct", - "display_name": "Qwen2.5 72B Instruct", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -146833,7 +151660,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -146843,104 +151670,125 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen-mt-turbo", - "name": "Qwen Mt Turbo", - "display_name": "Qwen Mt Turbo", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01", - "last_updated": "2025-01", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qvq-max", - "name": "QVQ Max", - "display_name": "QVQ Max", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -146948,60 +151796,111 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" - }, + } + ] + }, + "subconscious": { + "id": "subconscious", + "name": "Subconscious", + "display_name": "Subconscious", + "api": "https://api.subconscious.dev/v1", + "doc": "https://docs.subconscious.dev", + "models": [ { - "id": "qwen2-5-vl-7b-instruct", - "name": "Qwen2.5-VL 7B Instruct", - "display_name": "Qwen2.5-VL 7B Instruct", + "id": "subconscious/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "subconscious/tim-qwen3.6-27b", + "name": "TIM-Qwen3.6 27B", + "display_name": "TIM-Qwen3.6 27B", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 8192, + "output": 5000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-11", + "last_updated": "2026-05-11", + "type": "chat" + } + ] + }, + "tencent-coding-plan": { + "id": "tencent-coding-plan", + "name": "Tencent Coding Plan (China)", + "display_name": "Tencent Coding Plan (China)", + "api": "https://api.lkeap.cloud.tencent.com/coding/v3", + "doc": "https://cloud.tencent.com/document/product/1772/128947", + "models": [ + { + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -147020,22 +151919,21 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": false, + "open_weights": false, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "kimi-k2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" @@ -147043,7 +151941,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -147064,18 +151962,45 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen3-vl-30b-a3b", - "name": "Qwen3-VL 30B-A3B", - "display_name": "Qwen3-VL 30B-A3B", + "id": "hunyuan-2.0-instruct", + "name": "Tencent HY 2.0 Instruct", + "display_name": "Tencent HY 2.0 Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", + "type": "chat" + }, + { + "id": "hunyuan-2.0-thinking", + "name": "Tencent HY 2.0 Think", + "display_name": "Tencent HY 2.0 Think", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -147083,7 +152008,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -147103,16 +152028,15 @@ } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" }, { - "id": "qwen3-14b", - "name": "Qwen3 14B", - "display_name": "Qwen3 14B", + "id": "hunyuan-turbos", + "name": "Hunyuan-TurboS", + "display_name": "Hunyuan-TurboS", "modalities": { "input": [ "text" @@ -147123,18 +152047,40 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", + "type": "chat" + }, + { + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -147149,15 +152095,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen2-5-32b-instruct", - "name": "Qwen2.5 32B Instruct", - "display_name": "Qwen2.5 32B Instruct", + "id": "hunyuan-t1", + "name": "Hunyuan-T1", + "display_name": "Hunyuan-T1", "modalities": { "input": [ "text" @@ -147168,38 +152113,45 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" }, { - "id": "qwen3-omni-flash-realtime", - "name": "Qwen3-Omni Flash Realtime", - "display_name": "Qwen3-Omni Flash Realtime", + "id": "tc-code-latest", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 65536, + "context": 131072, "output": 16384 }, "temperature": true, @@ -147209,99 +152161,92 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" - }, + } + ] + }, + "hyper": { + "id": "hyper", + "name": "Charm Hyper", + "display_name": "Charm Hyper", + "api": "https://hyper.charm.land/v1", + "doc": "https://hyper.charm.land", + "models": [ { - "id": "qwen3-235b-a22b", - "name": "Qwen3 235B A22B", - "display_name": "Qwen3 235B A22B", + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-27", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-06-15", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3-8b", - "name": "Qwen3 8B", - "display_name": "Qwen3 8B", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -147311,19 +152256,14 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 202752, + "output": 20275 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -147338,15 +152278,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2026-04-13", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen2-5-14b-instruct", - "name": "Qwen2.5 14B Instruct", - "display_name": "Qwen2.5 14B Instruct", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -147356,25 +152295,30 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 202800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "release_date": "2026-06-04", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -147385,52 +152329,36 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", - "type": "chat" - }, - { - "id": "qwen2-5-7b-instruct", - "name": "Qwen2.5 7B Instruct", - "display_name": "Qwen2.5 7B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-09", - "last_updated": "2024-09", + "knowledge": "2025-05", + "release_date": "2026-07-06", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text" @@ -147440,25 +152368,37 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 26214 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-13", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -147468,19 +152408,14 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262100, + "output": 6553 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -147493,23 +152428,16 @@ ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": true, + "release_date": "2026-06-05", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -147520,78 +152448,62 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "open_weights": true, + "release_date": "2026-06-30", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen-omni-turbo-realtime", - "name": "Qwen-Omni Turbo Realtime", - "display_name": "Qwen-Omni Turbo Realtime", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-05-08", - "last_updated": "2025-05-08", + "release_date": "2026-05-28", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "qwen3.6-max", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -147601,19 +152513,14 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -147626,147 +152533,125 @@ ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-04-28", + "knowledge": "2025-04", + "release_date": "2026-05-20", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen2-5-omni-7b", - "name": "Qwen2.5-Omni 7B", - "display_name": "Qwen2.5-Omni 7B", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-12", - "last_updated": "2024-12", + "knowledge": "2025-01", + "release_date": "2026-07-03", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3-asr-flash", - "name": "Qwen3-ASR Flash", - "display_name": "Qwen3-ASR Flash", + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 53248, - "output": 4096 + "context": 430000, + "output": 43000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-08", - "last_updated": "2025-09-08", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2026-04-30", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwq-plus", - "name": "QwQ Plus", - "display_name": "QwQ Plus", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 512000, + "output": 512000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 32768, - "min": 0, - "max": 32768 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-03-05", - "last_updated": "2025-03-05", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 25600 }, "temperature": true, "tool_call": true, @@ -147776,67 +152661,47 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 12800 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2023-12", + "release_date": "2026-04-30", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -147846,8 +152711,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -147867,77 +152732,83 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-06", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen-vl-ocr", - "name": "Qwen Vl Ocr", - "display_name": "Qwen Vl Ocr", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 34096, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-10-28", - "last_updated": "2025-04-13", + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "qwen3-livetranslate-flash-realtime", - "name": "Qwen3-LiveTranslate Flash Realtime", - "display_name": "Qwen3-LiveTranslate Flash Realtime", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 53248, - "output": 4096 + "context": 1048576, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-08-02", + "last_updated": "2026-08-02", "type": "chat" }, { - "id": "qwen-plus-character-ja", - "name": "Qwen Plus Character (Japanese)", - "display_name": "Qwen Plus Character (Japanese)", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -147947,42 +152818,44 @@ ] }, "limit": { - "context": 8192, - "output": 512 + "context": 131072, + "output": 13107 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01", - "last_updated": "2024-01", + "open_weights": true, + "release_date": "2026-04-13", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3-omni-flash", - "name": "Qwen3-Omni Flash", - "display_name": "Qwen3-Omni Flash", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 256000, + "output": 16000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -147990,31 +152863,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-07-03", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -148022,7 +152888,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -148041,33 +152907,30 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-05-20", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -148075,25 +152938,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-07-27", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "qwen3-coder-480b-a35b-instruct-int4-mixed-ar", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ "text" @@ -148103,8 +152960,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 106000, + "output": 10600 }, "temperature": true, "tool_call": true, @@ -148114,14 +152971,14 @@ "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-04-30", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen-vl-plus", - "name": "Qwen-VL Plus", - "display_name": "Qwen-VL Plus", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", @@ -148132,25 +152989,37 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-08-15", + "knowledge": "2025-04", + "release_date": "2026-05-20", + "last_updated": "2026-07-22", "type": "chat" }, { - "id": "qwen3-coder-plus-2025-09-23", - "name": "Qwen3 Coder Plus 2025 09 23", - "display_name": "Qwen3 Coder Plus 2025 09 23", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -148160,8 +153029,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 26214 }, "temperature": true, "tool_call": true, @@ -148169,12 +153038,25 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-04-30", + "last_updated": "2026-07-22", "type": "chat" - }, + } + ] + }, + "alibaba": { + "id": "alibaba", + "name": "alibaba", + "display_name": "alibaba", + "api": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/models", + "models": [ { - "id": "qwen3-coder-plus-2025-07-22", - "name": "Qwen3 Coder Plus 2025 07 22", - "display_name": "Qwen3 Coder Plus 2025 07 22", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ "text" @@ -148184,7 +153066,7 @@ ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 65536 }, "temperature": true, @@ -148193,37 +153075,52 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen-vl-ocr-latest", - "name": "Qwen Vl Ocr Latest", - "display_name": "Qwen Vl Ocr Latest", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 34096, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "qvq-max-2025-05-15", - "name": "Qvq Max 2025 05 15", - "display_name": "Qvq Max 2025 05 15", + "id": "qwen3-vl-plus", + "name": "Qwen3 VL Plus", + "display_name": "Qwen3 VL Plus", "modalities": { "input": [ "text", @@ -148234,8 +153131,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": false, @@ -148243,42 +153140,33 @@ "supported": true, "default": false, "budget": { - "default": 16384, + "default": 81920, "min": 0, - "max": 16384 + "max": 81920 } }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen-long", - "name": "Qwen Long", - "display_name": "Qwen Long", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "qwen-turbo-latest", - "name": "Qwen Turbo Latest", - "display_name": "Qwen Turbo Latest", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -148295,7 +153183,7 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false, + "default": true, "budget": { "default": 38912, "min": 0, @@ -148313,65 +153201,37 @@ ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen-turbo-2024-09-19", - "name": "Qwen Turbo 2024 09 19", - "display_name": "Qwen Turbo 2024 09 19", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen-flash-2025-07-28", - "name": "Qwen Flash 2025 07 28", - "display_name": "Qwen Flash 2025 07 28", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -148384,19 +153244,16 @@ ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen-plus-latest", - "name": "Qwen Plus Latest", - "display_name": "Qwen Plus Latest", + "id": "qwen-mt-plus", + "name": "Qwen Mt Plus", + "display_name": "Qwen Mt Plus", "modalities": { "input": [ "text" @@ -148406,47 +153263,29 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 16384, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01", + "last_updated": "2025-01", "type": "chat" }, { - "id": "qwen-plus-2024-09-19", - "name": "Qwen Plus 2024 09 19", - "display_name": "Qwen Plus 2024 09 19", + "id": "qwen2-5-vl-72b-instruct", + "name": "Qwen2.5-VL 72B Instruct", + "display_name": "Qwen2.5-VL 72B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -148462,12 +153301,16 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "qwen-plus-2025-07-14", - "name": "Qwen Plus 2025 07 14", - "display_name": "Qwen Plus 2025 07 14", + "id": "qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ "text" @@ -148477,30 +153320,13 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "search": { "supported": true, @@ -148509,15 +153335,21 @@ "search_strategy": "turbo" }, "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "qwen-plus-2025-09-11", - "name": "Qwen Plus 2025 09 11", - "display_name": "Qwen Plus 2025 09 11", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -148525,18 +153357,13 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -148549,59 +153376,60 @@ ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "qwen-max-latest", - "name": "Qwen Max Latest", - "display_name": "Qwen Max Latest", + "id": "qwen-omni-turbo", + "name": "Qwen-Omni Turbo", + "display_name": "Qwen-Omni Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01-19", + "last_updated": "2025-03-26", "type": "chat" }, { - "id": "qwen-max-2024-09-19", - "name": "Qwen Max 2024 09 19", - "display_name": "Qwen Max 2024 09 19", + "id": "qwen-vl-max", + "name": "Qwen-VL Max", + "display_name": "Qwen-VL Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 131072, "output": 8192 }, "temperature": true, @@ -148609,19 +153437,17 @@ "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-08", + "last_updated": "2025-08-13", "type": "chat" }, { - "id": "qwen-max-2024-04-28", - "name": "Qwen Max 2024 04 28", - "display_name": "Qwen Max 2024 04 28", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -148631,8 +153457,8 @@ ] }, "limit": { - "context": 8000, - "output": 2000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -148640,39 +153466,62 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen-max-2024-04-03", - "name": "Qwen Max 2024 04 03", - "display_name": "Qwen Max 2024 04 03", + "id": "qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 2000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen-max-2025-01-25", - "name": "Qwen Max 2025 01 25", - "display_name": "Qwen Max 2025 01 25", + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3-VL 235B-A22B", + "display_name": "Qwen3-VL 235B-A22B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -148680,26 +153529,36 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "search": { "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen3-max-2025-09-23", - "name": "Qwen3 Max 20250923", - "display_name": "Qwen3 Max 20250923", + "id": "qwen2-5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "display_name": "Qwen2.5 72B Instruct", "modalities": { "input": [ "text" @@ -148709,27 +153568,25 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "qwen3-max-preview", - "name": "Qwen3 Max Preview", - "display_name": "Qwen3 Max Preview", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -148739,38 +153596,30 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen3 235B A22B Thinking 2507", + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "display_name": "Qwen3 Next 80B A3B Thinking", "modalities": { "input": [ "text" @@ -148806,12 +153655,16 @@ } }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "qwen-mt-turbo", + "name": "Qwen Mt Turbo", + "display_name": "Qwen Mt Turbo", "modalities": { "input": [ "text" @@ -148821,24 +153674,59 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 16384, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01", + "last_updated": "2025-01", "type": "chat" }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "qvq-max", + "name": "QVQ Max", + "display_name": "QVQ Max", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", + "type": "chat" + }, + { + "id": "qwen2-5-vl-7b-instruct", + "name": "Qwen2.5-VL 7B Instruct", + "display_name": "Qwen2.5-VL 7B Instruct", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" @@ -148846,7 +153734,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -148854,34 +153742,36 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "qwen3-30b-a3b-thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -148894,35 +153784,36 @@ ] } }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -148935,16 +153826,20 @@ ] } }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen3-4b", - "name": "Qwen3 4B", - "display_name": "Qwen3 4B", + "id": "qwen3-vl-30b-a3b", + "name": "Qwen3-VL 30B-A3B", + "display_name": "Qwen3-VL 30B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -148952,18 +153847,13 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -148977,12 +153867,16 @@ } }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen3-1.7b", - "name": "Qwen3 1.7B", - "display_name": "Qwen3 1.7B", + "id": "qwen3-14b", + "name": "Qwen3 14B", + "display_name": "Qwen3 14B", "modalities": { "input": [ "text" @@ -148992,7 +153886,7 @@ ] }, "limit": { - "context": 32768, + "context": 131072, "output": 8192 }, "temperature": true, @@ -149001,9 +153895,9 @@ "supported": true, "default": true, "budget": { - "default": 30720, + "default": 38912, "min": 0, - "max": 30720 + "max": 38912 } }, "extra_capabilities": { @@ -149018,12 +153912,16 @@ } }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen3-0.6b", - "name": "Qwen3 0.6B", - "display_name": "Qwen3 0.6B", + "id": "qwen2-5-32b-instruct", + "name": "Qwen2.5 32B Instruct", + "display_name": "Qwen2.5 32B Instruct", "modalities": { "input": [ "text" @@ -149033,53 +153931,71 @@ ] }, "limit": { - "context": 32768, + "context": 131072, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 30720, - "min": 0, - "max": 30720 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "qwen3-vl-plus-2025-09-23", - "name": "Qwen3 VL Plus 2025 09 23", - "display_name": "Qwen3 VL Plus 2025 09 23", + "id": "qwen3-omni-flash-realtime", + "name": "Qwen3-Omni Flash Realtime", + "display_name": "Qwen3-Omni Flash Realtime", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" + ], + "output": [ + "text", + "audio" + ] + }, + "limit": { + "context": 65536, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", + "type": "chat" + }, + { + "id": "qwen3-235b-a22b", + "name": "Qwen3 235B A22B", + "display_name": "Qwen3 235B A22B", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": false, @@ -149101,12 +154017,16 @@ } }, "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwq-plus-latest", - "name": "QwQ Plus Latest", - "display_name": "QwQ Plus Latest", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -149116,19 +154036,13 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 32768, - "min": 0, - "max": 32768 - } + "supported": true }, "extra_capabilities": { "reasoning": { @@ -149141,55 +154055,62 @@ ] } }, - "search": { - "supported": false - }, "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" - } - ] - }, - "github-models": { - "id": "github-models", - "name": "GitHub Models", - "display_name": "GitHub Models", - "api": "https://models.github.ai/inference", - "doc": "https://docs.github.com/en/github-models", - "models": [ + }, { - "id": "microsoft/phi-3.5-vision-instruct", - "name": "Phi-3.5-vision instruct (128k)", - "display_name": "Phi-3.5-vision instruct (128k)", + "id": "qwen3-8b", + "name": "Qwen3 8B", + "display_name": "Qwen3 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-08-20", - "last_updated": "2024-08-20", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "microsoft/phi-4-mini-instruct", - "name": "Phi-4-mini-instruct", - "display_name": "Phi-4-mini-instruct", + "id": "qwen2-5-14b-instruct", + "name": "Qwen2.5 14B Instruct", + "display_name": "Qwen2.5 14B Instruct", "modalities": { "input": [ "text" @@ -149199,26 +154120,25 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "microsoft/phi-3.5-mini-instruct", - "name": "Phi-3.5-mini instruct (128k)", - "display_name": "Phi-3.5-mini instruct (128k)", + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -149228,26 +154148,25 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-08-20", - "last_updated": "2024-08-20", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "microsoft/phi-3-medium-4k-instruct", - "name": "Phi-3-medium instruct (4k)", - "display_name": "Phi-3-medium instruct (4k)", + "id": "qwen2-5-7b-instruct", + "name": "Qwen2.5 7B Instruct", + "display_name": "Qwen2.5 7B Instruct", "modalities": { "input": [ "text" @@ -149257,37 +154176,38 @@ ] }, "limit": { - "context": 4096, - "output": 1024 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-04-23", - "last_updated": "2024-04-23", + "knowledge": "2024-04", + "release_date": "2024-09", + "last_updated": "2024-09", "type": "chat" }, { - "id": "microsoft/phi-4", - "name": "Phi-4", - "display_name": "Phi-4", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -149295,17 +154215,27 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "microsoft/phi-4-reasoning", - "name": "Phi-4-Reasoning", - "display_name": "Phi-4-Reasoning", + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -149315,26 +154245,25 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "microsoft/phi-3.5-moe-instruct", - "name": "Phi-3.5-MoE instruct (128k)", - "display_name": "Phi-3.5-MoE instruct (128k)", + "id": "qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ "text" @@ -149344,26 +154273,48 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-08-20", - "last_updated": "2024-08-20", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "microsoft/phi-3-mini-4k-instruct", - "name": "Phi-3-mini instruct (4k)", - "display_name": "Phi-3-mini instruct (4k)", + "id": "qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -149373,55 +154324,79 @@ ] }, "limit": { - "context": 4096, - "output": 1024 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-04-23", - "last_updated": "2024-04-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "microsoft/phi-4-mini-reasoning", - "name": "Phi-4-mini-reasoning", - "display_name": "Phi-4-mini-reasoning", + "id": "qwen-omni-turbo-realtime", + "name": "Qwen-Omni Turbo Realtime", + "display_name": "Qwen-Omni Turbo Realtime", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-05-08", + "last_updated": "2025-05-08", "type": "chat" }, { - "id": "microsoft/mai-ds-r1", - "name": "MAI-DS-R1", - "display_name": "MAI-DS-R1", + "id": "qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ "text" @@ -149431,84 +154406,108 @@ ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "microsoft/phi-3-mini-128k-instruct", - "name": "Phi-3-mini instruct (128k)", - "display_name": "Phi-3-mini instruct (128k)", + "id": "qwen2-5-omni-7b", + "name": "Qwen2.5-Omni 7B", + "display_name": "Qwen2.5-Omni 7B", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-04-23", - "last_updated": "2024-04-23", + "knowledge": "2024-04", + "release_date": "2024-12", + "last_updated": "2024-12", "type": "chat" }, { - "id": "microsoft/phi-3-small-128k-instruct", - "name": "Phi-3-small instruct (128k)", - "display_name": "Phi-3-small instruct (128k)", + "id": "qwen3-asr-flash", + "name": "Qwen3-ASR Flash", + "display_name": "Qwen3-ASR Flash", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 53248, "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-04-23", - "last_updated": "2024-04-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-09-08", + "last_updated": "2025-09-08", "type": "chat" }, { - "id": "microsoft/phi-3-small-8k-instruct", - "name": "Phi-3-small instruct (8k)", - "display_name": "Phi-3-small instruct (8k)", + "id": "qwq-plus", + "name": "QwQ Plus", + "display_name": "QwQ Plus", "modalities": { "input": [ "text" @@ -149518,39 +154517,61 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 32768, + "min": 0, + "max": 32768 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-04-23", - "last_updated": "2024-04-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-03-05", + "last_updated": "2025-03-05", "type": "chat" }, { - "id": "microsoft/phi-4-multimodal-instruct", - "name": "Phi-4-multimodal-instruct", - "display_name": "Phi-4-multimodal-instruct", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -149558,28 +154579,41 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "microsoft/phi-3-medium-128k-instruct", - "name": "Phi-3-medium instruct (128k)", - "display_name": "Phi-3-medium instruct (128k)", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -149587,17 +154621,27 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-04-23", - "last_updated": "2024-04-23", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "cohere/cohere-command-r", - "name": "Cohere Command R", - "display_name": "Cohere Command R", + "id": "qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -149607,8 +154651,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -149616,101 +154660,89 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-03-11", - "last_updated": "2024-08-01", - "type": "chat" - }, - { - "id": "cohere/cohere-command-r-plus", - "name": "Cohere Command R+", - "display_name": "Cohere Command R+", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-04-04", - "last_updated": "2024-08-01", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "cohere/cohere-command-r-08-2024", - "name": "Cohere Command R 08-2024", - "display_name": "Cohere Command R 08-2024", + "id": "qwen-vl-ocr", + "name": "Qwen Vl Ocr", + "display_name": "Qwen Vl Ocr", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 34096, "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-08-01", - "last_updated": "2024-08-01", + "knowledge": "2024-04", + "release_date": "2024-10-28", + "last_updated": "2025-04-13", "type": "chat" }, { - "id": "cohere/cohere-command-r-plus-08-2024", - "name": "Cohere Command R+ 08-2024", - "display_name": "Cohere Command R+ 08-2024", + "id": "qwen3-livetranslate-flash-realtime", + "name": "Qwen3-LiveTranslate Flash Realtime", + "display_name": "Qwen3-LiveTranslate Flash Realtime", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 128000, + "context": 53248, "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-08-01", - "last_updated": "2024-08-01", + "knowledge": "2024-04", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "cohere/cohere-command-a", - "name": "Cohere Command A", - "display_name": "Cohere Command A", + "id": "qwen-plus-character-ja", + "name": "Qwen Plus Character (Japanese)", + "display_name": "Qwen Plus Character (Japanese)", "modalities": { "input": [ "text" @@ -149720,37 +154752,40 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 512 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "knowledge": "2024-04", + "release_date": "2024-01", + "last_updated": "2024-01", "type": "chat" }, { - "id": "mistral-ai/ministral-3b", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "qwen3-omni-flash", + "name": "Qwen3-Omni Flash", + "display_name": "Qwen3-Omni Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 65536, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -149758,28 +154793,41 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2024-03", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "mistral-ai/mistral-large-2411", - "name": "Mistral Large 24.11", - "display_name": "Mistral Large 24.11", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -149787,29 +154835,42 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "mistral-ai/mistral-medium-2505", - "name": "Mistral Medium 3 (25.05)", - "display_name": "Mistral Medium 3 (25.05)", + "id": "qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -149817,17 +154878,27 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-05-01", - "last_updated": "2025-05-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistral-ai/mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ "text" @@ -149837,26 +154908,25 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-03", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "mistral-ai/mistral-small-2503", - "name": "Mistral Small 3.1", - "display_name": "Mistral Small 3.1", + "id": "qwen-vl-plus", + "name": "Qwen-VL Plus", + "display_name": "Qwen-VL Plus", "modalities": { "input": [ "text", @@ -149867,26 +154937,25 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-08-15", "type": "chat" }, { - "id": "mistral-ai/codestral-2501", - "name": "Codestral 25.01", - "display_name": "Codestral 25.01", + "id": "qwen3-coder-plus-2025-09-23", + "name": "Qwen3 Coder Plus 2025 09 23", + "display_name": "Qwen3 Coder Plus 2025 09 23", "modalities": { "input": [ "text" @@ -149896,26 +154965,21 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-03", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", "type": "chat" }, { - "id": "ai21-labs/ai21-jamba-1.5-large", - "name": "AI21 Jamba 1.5 Large", - "display_name": "AI21 Jamba 1.5 Large", + "id": "qwen3-coder-plus-2025-07-22", + "name": "Qwen3 Coder Plus 2025 07 22", + "display_name": "Qwen3 Coder Plus 2025 07 22", "modalities": { "input": [ "text" @@ -149925,55 +154989,46 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-08-29", - "last_updated": "2024-08-29", "type": "chat" }, { - "id": "ai21-labs/ai21-jamba-1.5-mini", - "name": "AI21 Jamba 1.5 Mini", - "display_name": "AI21 Jamba 1.5 Mini", + "id": "qwen-vl-ocr-latest", + "name": "Qwen Vl Ocr Latest", + "display_name": "Qwen Vl Ocr Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 34096, "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-08-29", - "last_updated": "2024-08-29", "type": "chat" }, { - "id": "meta/llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", + "id": "qvq-max-2025-05-15", + "name": "Qvq Max 2025 05 15", + "display_name": "Qvq Max 2025 05 15", "modalities": { "input": [ "text", @@ -149984,26 +155039,27 @@ ] }, "limit": { - "context": 128000, + "context": 131072, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 16384, + "min": 0, + "max": 16384 + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-31", - "last_updated": "2025-01-31", "type": "chat" }, { - "id": "meta/llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "qwen-long", + "name": "Qwen Long", + "display_name": "Qwen Long", "modalities": { "input": [ "text" @@ -150013,26 +155069,21 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", "type": "chat" }, { - "id": "meta/meta-llama-3-70b-instruct", - "name": "Meta-Llama-3-70B-Instruct", - "display_name": "Meta-Llama-3-70B-Instruct", + "id": "qwen-turbo-latest", + "name": "Qwen Turbo Latest", + "display_name": "Qwen Turbo Latest", "modalities": { "input": [ "text" @@ -150042,57 +155093,68 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-04-18", - "last_updated": "2024-04-18", "type": "chat" }, { - "id": "meta/llama-3.2-90b-vision-instruct", - "name": "Llama-3.2-90B-Vision-Instruct", - "display_name": "Llama-3.2-90B-Vision-Instruct", + "id": "qwen-turbo-2024-09-19", + "name": "Qwen Turbo 2024 09 19", + "display_name": "Qwen Turbo 2024 09 19", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 131072, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", "type": "chat" }, { - "id": "meta/meta-llama-3.1-8b-instruct", - "name": "Meta-Llama-3.1-8B-Instruct", - "display_name": "Meta-Llama-3.1-8B-Instruct", + "id": "qwen-flash-2025-07-28", + "name": "Qwen Flash 2025 07 28", + "display_name": "Qwen Flash 2025 07 28", "modalities": { "input": [ "text" @@ -150102,26 +155164,44 @@ ] }, "limit": { - "context": 128000, + "context": 1000000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", "type": "chat" }, { - "id": "meta/meta-llama-3-8b-instruct", - "name": "Meta-Llama-3-8B-Instruct", - "display_name": "Meta-Llama-3-8B-Instruct", + "id": "qwen-plus-latest", + "name": "Qwen Plus Latest", + "display_name": "Qwen Plus Latest", "modalities": { "input": [ "text" @@ -150131,26 +155211,44 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-04-18", - "last_updated": "2024-04-18", "type": "chat" }, { - "id": "meta/meta-llama-3.1-405b-instruct", - "name": "Meta-Llama-3.1-405B-Instruct", - "display_name": "Meta-Llama-3.1-405B-Instruct", + "id": "qwen-plus-2024-09-19", + "name": "Qwen Plus 2024 09 19", + "display_name": "Qwen Plus 2024 09 19", "modalities": { "input": [ "text" @@ -150160,26 +155258,21 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", "type": "chat" }, { - "id": "meta/meta-llama-3.1-70b-instruct", - "name": "Meta-Llama-3.1-70B-Instruct", - "display_name": "Meta-Llama-3.1-70B-Instruct", + "id": "qwen-plus-2025-07-14", + "name": "Qwen Plus 2025 07 14", + "display_name": "Qwen Plus 2025 07 14", "modalities": { "input": [ "text" @@ -150189,87 +155282,121 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", "type": "chat" }, { - "id": "meta/llama-3.2-11b-vision-instruct", - "name": "Llama-3.2-11B-Vision-Instruct", - "display_name": "Llama-3.2-11B-Vision-Instruct", + "id": "qwen-plus-2025-09-11", + "name": "Qwen Plus 2025 09 11", + "display_name": "Qwen Plus 2025 09 11", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", "type": "chat" }, { - "id": "meta/llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B 16E Instruct", - "display_name": "Llama 4 Scout 17B 16E Instruct", + "id": "qwen-max-latest", + "name": "Qwen Max Latest", + "display_name": "Qwen Max Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 131072, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { + "supported": false + }, + "search": { "supported": true, - "default": true + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-31", - "last_updated": "2025-01-31", "type": "chat" }, { - "id": "xai/grok-3-mini", - "name": "Grok 3 Mini", - "display_name": "Grok 3 Mini", + "id": "qwen-max-2024-09-19", + "name": "Qwen Max 2024 09 19", + "display_name": "Qwen Max 2024 09 19", "modalities": { "input": [ "text" @@ -150279,26 +155406,27 @@ ] }, "limit": { - "context": 128000, + "context": 32768, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { + "supported": false + }, + "search": { "supported": true, - "default": true + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-09", - "last_updated": "2024-12-09", "type": "chat" }, { - "id": "xai/grok-3", - "name": "Grok 3", - "display_name": "Grok 3", + "id": "qwen-max-2024-04-28", + "name": "Qwen Max 2024 04 28", + "display_name": "Qwen Max 2024 04 28", "modalities": { "input": [ "text" @@ -150308,26 +155436,21 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 8000, + "output": 2000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-09", - "last_updated": "2024-12-09", "type": "chat" }, { - "id": "core42/jais-30b-chat", - "name": "JAIS 30b Chat", - "display_name": "JAIS 30b Chat", + "id": "qwen-max-2024-04-03", + "name": "Qwen Max 2024 04 03", + "display_name": "Qwen Max 2024 04 03", "modalities": { "input": [ "text" @@ -150337,26 +155460,21 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 8000, + "output": 2000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-03", - "release_date": "2023-08-30", - "last_updated": "2023-08-30", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek-R1-0528", - "display_name": "DeepSeek-R1-0528", + "id": "qwen-max-2025-01-25", + "name": "Qwen Max 2025 01 25", + "display_name": "Qwen Max 2025 01 25", "modalities": { "input": [ "text" @@ -150366,37 +155484,27 @@ ] }, "limit": { - "context": 65536, + "context": 131072, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", "type": "chat" }, { - "id": "deepseek/deepseek-v3-0324", - "name": "DeepSeek-V3-0324", - "display_name": "DeepSeek-V3-0324", + "id": "qwen3-max-2025-09-23", + "name": "Qwen3 Max 20250923", + "display_name": "Qwen3 Max 20250923", "modalities": { "input": [ "text" @@ -150406,26 +155514,27 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { + "supported": false + }, + "search": { "supported": true, - "default": true + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-03-24", - "last_updated": "2025-03-24", "type": "chat" }, { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "qwen3-max-preview", + "name": "Qwen3 Max Preview", + "display_name": "Qwen3 Max Preview", "modalities": { "input": [ "text" @@ -150435,14 +155544,13 @@ ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -150455,105 +155563,108 @@ ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1-mini", - "display_name": "GPT-4.1-mini", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1-nano", - "display_name": "GPT-4.1-nano", + "id": "qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, "type": "chat" }, { - "id": "openai/o3-mini", - "name": "OpenAI o3-mini", - "display_name": "OpenAI o3-mini", + "id": "qwen3-30b-a3b-thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ "text" @@ -150563,70 +155674,38 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-31", - "last_updated": "2025-01-31", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", - "modalities": { - "input": [ - "text", - "image", - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", "type": "chat" }, { - "id": "openai/o1-preview", - "name": "OpenAI o1-preview", - "display_name": "OpenAI o1-preview", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -150636,157 +155715,161 @@ ] }, "limit": { - "context": 128000, + "context": 131072, "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2024-09-12", - "last_updated": "2024-09-12", "type": "chat" }, { - "id": "openai/o1", - "name": "OpenAI o1", - "display_name": "OpenAI o1", + "id": "qwen3-4b", + "name": "Qwen3 4B", + "display_name": "Qwen3 4B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2024-09-12", - "last_updated": "2024-12-17", "type": "chat" }, { - "id": "openai/o3", - "name": "OpenAI o3", - "display_name": "OpenAI o3", + "id": "qwen3-1.7b", + "name": "Qwen3 1.7B", + "display_name": "Qwen3 1.7B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32768, + "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 30720, + "min": 0, + "max": 30720 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-31", - "last_updated": "2025-01-31", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "qwen3-0.6b", + "name": "Qwen3 0.6B", + "display_name": "Qwen3 0.6B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true, + "budget": { + "default": 30720, + "min": 0, + "max": 30720 + } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "type": "chat" }, { - "id": "openai/o4-mini", - "name": "OpenAI o4-mini", - "display_name": "OpenAI o4-mini", + "id": "qwen3-vl-plus-2025-09-23", + "name": "Qwen3 VL Plus 2025 09 23", + "display_name": "Qwen3 VL Plus 2025 09 23", "modalities": { "input": [ "text", @@ -150797,40 +155880,38 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-31", - "last_updated": "2025-01-31", "type": "chat" }, { - "id": "openai/o1-mini", - "name": "OpenAI o1-mini", - "display_name": "OpenAI o1-mini", + "id": "qwq-plus-latest", + "name": "QwQ Plus Latest", + "display_name": "QwQ Plus Latest", "modalities": { "input": [ "text" @@ -150840,34 +155921,35 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 32768, + "min": 0, + "max": 32768 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, + "search": { + "supported": false + }, "attachment": false, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2024-09-12", - "last_updated": "2024-12-17", "type": "chat" } ] @@ -152263,6 +157345,7 @@ "context": 1000000, "output": 1000000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -153431,6 +158514,32 @@ "last_updated": "2025-06", "type": "chat" }, + { + "id": "bfl/flux-3-video", + "name": "Flux 3", + "display_name": "Flux 3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-08-04", + "last_updated": "2026-08-04", + "type": "chat" + }, { "id": "bfl/flux-2-klein-4b", "name": "FLUX.2 [klein] 4B", @@ -155553,8 +160662,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048600, + "output": 1048600 }, "temperature": true, "tool_call": true, @@ -155596,6 +160705,7 @@ "context": 1000000, "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155607,9 +160717,10 @@ } }, "attachment": false, - "open_weights": false, + "open_weights": true, + "knowledge": "2025-05", "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "last_updated": "2026-07-31", "type": "chat" }, { @@ -155906,6 +161017,7 @@ "context": 991000, "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155919,7 +161031,7 @@ "attachment": true, "open_weights": false, "release_date": "2026-07-28", - "last_updated": "2026-07-28", + "last_updated": "2026-07-15", "type": "chat" }, { @@ -156022,77 +161134,323 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", - "type": "chat" - }, - { - "id": "alibaba/qwen-3-14b", - "name": "Qwen3-14B", - "display_name": "Qwen3-14B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04", - "type": "chat" - }, - { - "id": "alibaba/qwen3.7-max", - "name": "Qwen 3.7 Max", - "display_name": "Qwen 3.7 Max", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 991000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", + "type": "chat" + }, + { + "id": "alibaba/qwen-3-14b", + "name": "Qwen3-14B", + "display_name": "Qwen3-14B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 40960, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "alibaba/qwen3.7-max", + "name": "Qwen 3.7 Max", + "display_name": "Qwen 3.7 Max", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 991000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", + "type": "chat" + }, + { + "id": "alibaba/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "display_name": "Qwen3 Next 80B A3B Thinking", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-09-11", + "last_updated": "2025-09", + "type": "chat" + }, + { + "id": "alibaba/qwen3.6-27b", + "name": "Qwen 3.6 27B", + "display_name": "Qwen 3.6 27B", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "alibaba/qwen-3-30b", + "name": "Qwen3-30B-A3B", + "display_name": "Qwen3-30B-A3B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 40960, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "alibaba/wan-v2.6-r2v-flash", + "name": "Wan v2.6 Reference-to-Video Flash", + "display_name": "Wan v2.6 Reference-to-Video Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "type": "chat" + }, + { + "id": "alibaba/qwen3-max-preview", + "name": "Qwen3 Max Preview", + "display_name": "Qwen3 Max Preview", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-05", + "last_updated": "2025-09-23", + "type": "chat" + }, + { + "id": "alibaba/qwen-3-235b", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "alibaba/qwen3.5-flash", + "name": "Qwen 3.5 Flash", + "display_name": "Qwen 3.5 Flash", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "alibaba/qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", + "id": "alibaba/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -156102,14 +161460,13 @@ ] }, "limit": { - "context": 131072, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -156123,57 +161480,16 @@ } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-09-11", - "last_updated": "2025-09", - "type": "chat" - }, - { - "id": "alibaba/qwen3.6-27b", - "name": "Qwen 3.6 27B", - "display_name": "Qwen 3.6 27B", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "alibaba/qwen-3-30b", - "name": "Qwen3-30B-A3B", - "display_name": "Qwen3-30B-A3B", + "id": "alibaba/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -156183,26 +161499,25 @@ ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "alibaba/wan-v2.6-r2v-flash", - "name": "Wan v2.6 Reference-to-Video Flash", - "display_name": "Wan v2.6 Reference-to-Video Flash", + "id": "alibaba/wan-v2.7-r2v", + "name": "Wan v2.7 Reference-to-Video", + "display_name": "Wan v2.7 Reference-to-Video", "modalities": { "input": [ "text" @@ -156222,87 +161537,18 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16", - "type": "chat" - }, - { - "id": "alibaba/qwen3-max-preview", - "name": "Qwen3 Max Preview", - "display_name": "Qwen3 Max Preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-05", - "last_updated": "2025-09-23", - "type": "chat" - }, - { - "id": "alibaba/qwen-3-235b", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "alibaba/qwen3.5-flash", - "name": "Qwen 3.5 Flash", - "display_name": "Qwen 3.5 Flash", + "id": "alibaba/qwen3.8-max", + "name": "Qwen 3.8 Max", + "display_name": "Qwen 3.8 Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -156310,7 +161556,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -156320,113 +161566,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", - "type": "chat" - }, - { - "id": "alibaba/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" - }, - { - "id": "alibaba/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.7-r2v", - "name": "Wan v2.7 Reference-to-Video", - "display_name": "Wan v2.7 Reference-to-Video", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-08-02", + "last_updated": "2026-07-19", "type": "chat" }, { @@ -157291,7 +162437,7 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -157549,7 +162695,7 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -157746,170 +162892,39 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" - }, - { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-29", - "last_updated": "2026-06-30", - "type": "chat" - }, - { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", - "type": "chat" - }, - { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -157922,7 +162937,79 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-29", + "last_updated": "2026-06-30", + "type": "chat" + }, + { + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", + "type": "chat" + }, + { + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -157934,11 +163021,18 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -157946,22 +163040,22 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -157973,8 +163067,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -158005,9 +163099,35 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "type": "chat" + }, + { + "id": "perplexity/pplx-embed-v1-0.6b", + "name": "Embed v1 0.6b", + "display_name": "Embed v1 0.6b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", "type": "chat" }, { @@ -158068,6 +163188,32 @@ "last_updated": "2025-02-19", "type": "chat" }, + { + "id": "perplexity/pplx-embed-v1-4b", + "name": "Embed v1 4b", + "display_name": "Embed v1 4b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "chat" + }, { "id": "perplexity/sonar-reasoning-pro", "name": "Sonar Reasoning Pro", @@ -161330,6 +166476,41 @@ "last_updated": "2025-04", "type": "chat" }, + { + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", + "type": "chat" + }, { "id": "qwen3.7-plus", "name": "Qwen3.7 Plus", @@ -162917,6 +168098,47 @@ "last_updated": "2024-01", "type": "chat" }, + { + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" + }, { "id": "deepseek-v3-2-exp", "name": "DeepSeek V3.2 Exp", @@ -168677,6 +173899,35 @@ "last_updated": "2026-04-02", "type": "chat" }, + { + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", + "type": "chat" + }, { "id": "thinkingmachines/Inkling", "name": "Inkling", @@ -169845,6 +175096,46 @@ "last_updated": "2026-06-01", "type": "chat" }, + { + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, { "id": "deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek-R1-0528", @@ -175396,6 +180687,36 @@ "last_updated": "2026-04-02", "type": "chat" }, + { + "id": "google/gemma-4-E4B-it", + "name": "Gemma 4 E4B IT", + "display_name": "Gemma 4 E4B IT", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, { "id": "google/gemma-4-31B-it", "name": "Gemma 4 31B IT", @@ -175431,6 +180752,66 @@ "last_updated": "2026-04-02", "type": "chat" }, + { + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", + "type": "chat" + }, + { + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", + "type": "chat" + }, { "id": "zai-org/GLM-5", "name": "GLM-5", @@ -175670,6 +181051,39 @@ "last_updated": "2025-12-22", "type": "chat" }, + { + "id": "tencent/Hy3", + "name": "Hy3", + "display_name": "Hy3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", + "type": "chat" + }, { "id": "Qwen/Qwen3.5-27B", "name": "Qwen3.5 27B", @@ -175994,6 +181408,40 @@ "last_updated": "2026-04-01", "type": "chat" }, + { + "id": "Qwen/Qwen3.8-Max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" + }, { "id": "Qwen/Qwen3-32B", "name": "Qwen3 32B", @@ -176243,6 +181691,40 @@ "last_updated": "2026-06-01", "type": "chat" }, + { + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, { "id": "deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek-R1-0528", @@ -176278,15 +181760,55 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2024-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -176296,8 +181818,8 @@ ] }, "limit": { - "context": 163840, - "output": 64000 + "context": 1048576, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -176317,16 +181839,16 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -176364,20 +181886,22 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "stepfun-ai/Step-3.7-Flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -176385,22 +181909,11 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { @@ -177084,58 +182597,6 @@ "last_updated": "2026-05-28", "type": "chat" }, - { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - }, { "id": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5 (latest)", @@ -177536,58 +182997,6 @@ "release_date": "2026-07-24", "last_updated": "2026-07-24", "type": "chat" - }, - { - "id": "claude-opus-4-1-20250805", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" } ] }, @@ -179915,6 +185324,87 @@ "last_updated": "2026-07-17", "type": "chat" }, + { + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" + }, + { + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, { "id": "deepseek-v3.2", "name": "DeepSeek V3.2", @@ -180849,6 +186339,35 @@ "last_updated": "2026-06-21", "type": "chat" }, + { + "id": "deepseek-ai/DeepSeek-V4-Flash-0731-TEE", + "name": "DeepSeek V4 Flash 0731 TEE", + "display_name": "DeepSeek V4 Flash 0731 TEE", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-08-02", + "type": "chat" + }, { "id": "moonshotai/Kimi-K2.6-TEE", "name": "Kimi K2.6 TEE", @@ -189878,34 +195397,6 @@ "api": "https://api.cortecs.ai/v1", "doc": "https://api.cortecs.ai/v1/models", "models": [ - { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262000, - "output": 262000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", - "type": "chat" - }, { "id": "claude-opus4-7", "name": "Claude Opus 4.7", @@ -189913,8 +195404,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -189922,7 +195412,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, "temperature": false, "tool_call": true, @@ -189950,13 +195440,14 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 40000, + "output": 40000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -189971,15 +195462,102 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "mistral-medium-3.5", + "name": "mistral-medium-3.5", + "display_name": "mistral-medium-3.5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", + "type": "chat" + }, + { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 1047576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { "id": "glm-5", - "name": "GLM 5", - "display_name": "GLM 5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -190011,8 +195589,8 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { @@ -190022,8 +195600,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -190047,14 +195624,103 @@ "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", + "type": "chat" + }, + { + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 262000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", + "type": "chat" + }, + { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" @@ -190099,9 +195765,38 @@ "type": "chat" }, { - "id": "glm-4.5-air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "holo2-30b-a3b", + "name": "holo2-30b-a3b", + "display_name": "holo2-30b-a3b", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 22000, + "output": 22000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-10", + "last_updated": "2025-12-10", + "type": "chat" + }, + { + "id": "apertus-70b", + "name": "apertus-70b", + "display_name": "apertus-70b", "modalities": { "input": [ "text" @@ -190111,20 +195806,151 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 65536, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-01", - "last_updated": "2025-08-01", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", + "type": "chat" + }, + { + "id": "voxtral-small-2507", + "name": "voxtral-small-2507", + "display_name": "voxtral-small-2507", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 32000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-02", + "last_updated": "2026-02-02", + "type": "chat" + }, + { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "type": "chat" + }, + { + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 1050000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { @@ -190140,8 +195966,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -190162,8 +195988,36 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-14", - "last_updated": "2026-04-14", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", + "type": "chat" + }, + { + "id": "gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { @@ -190180,7 +196034,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -190213,15 +196067,14 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 262144, "output": 256000 }, "temperature": true, @@ -190241,17 +196094,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-01", + "last_updated": "2026-01", "type": "chat" }, { "id": "minimax-m2.7", - "name": "MiniMax-m2.7", - "display_name": "MiniMax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -190261,7 +196114,7 @@ ] }, "limit": { - "context": 202752, + "context": 196608, "output": 196072 }, "temperature": true, @@ -190287,10 +196140,39 @@ "last_updated": "2026-03-18", "type": "chat" }, + { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 1047576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, { "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -190300,20 +196182,92 @@ ] }, "limit": { - "context": 262000, + "context": 262144, "output": 262000 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131000, + "output": 131000 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + }, + { + "id": "qwen3-vl-235b-a22b", + "name": "qwen3-vl-235b-a22b", + "display_name": "qwen3-vl-235b-a22b", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-13", + "last_updated": "2026-01-13", "type": "chat" }, { @@ -190352,8 +196306,35 @@ "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-08-08", - "last_updated": "2025-08-08", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "type": "chat" + }, + { + "id": "mistral-nemo-instruct-2407", + "name": "mistral-nemo-instruct-2407", + "display_name": "mistral-nemo-instruct-2407", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 131072 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-08-07", + "last_updated": "2024-08-07", "type": "chat" }, { @@ -190369,8 +196350,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -190395,13 +196376,219 @@ "last_updated": "2026-06-13", "type": "chat" }, + { + "id": "ministral-8b-2512", + "name": "ministral-8b-2512", + "display_name": "ministral-8b-2512", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", + "type": "chat" + }, { "id": "qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "display_name": "Qwen3-Next 80B-A3B (Thinking)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "type": "chat" + }, + { + "id": "ministral-14b-2512", + "name": "ministral-14b-2512", + "display_name": "ministral-14b-2512", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", + "type": "chat" + }, + { + "id": "ministral-3b-2512", + "name": "ministral-3b-2512", + "display_name": "ministral-3b-2512", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", + "type": "chat" + }, + { + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", + "type": "chat" + }, + { + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 262144, + "output": 256000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "chat" + }, + { + "id": "mistral-medium-2508", + "name": "mistral-medium-2508", + "display_name": "mistral-medium-2508", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" @@ -190411,6 +196598,93 @@ "context": 128000, "output": 128000 }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-08-07", + "last_updated": "2024-08-07", + "type": "chat" + }, + { + "id": "pixtral-12b-2409", + "name": "pixtral-12b-2409", + "display_name": "pixtral-12b-2409", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-11-09", + "last_updated": "2024-11-09", + "type": "chat" + }, + { + "id": "pixtral-large-2502", + "name": "pixtral-large-2502", + "display_name": "pixtral-large-2502", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", + "type": "chat" + }, + { + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 262000 + }, "temperature": true, "tool_call": true, "reasoning": { @@ -190428,17 +196702,159 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-11", - "last_updated": "2025-09-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "type": "chat" + }, + { + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", + "type": "chat" + }, + { + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 400000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "nemotron-nano-v2-12b", + "name": "nemotron-nano-v2-12b", + "display_name": "nemotron-nano-v2-12b", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-31", + "last_updated": "2025-10-31", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", @@ -190449,8 +196865,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -190460,25 +196876,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -190488,66 +196898,53 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "mistral-large-2402", + "name": "mistral-large-2402", + "display_name": "mistral-large-2402", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 128000 + "context": 32000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": false, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "minicpm-v-4.5", + "name": "minicpm-v-4.5", + "display_name": "minicpm-v-4.5", "modalities": { "input": [ "text" @@ -190557,26 +196954,24 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 32000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "qwen3guard-gen-8b", + "name": "qwen3guard-gen-8b", + "display_name": "qwen3guard-gen-8b", "modalities": { "input": [ "text" @@ -190586,24 +196981,18 @@ ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", "type": "chat" }, { @@ -190620,7 +197009,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -190646,6 +197035,35 @@ "last_updated": "2026-04-24", "type": "chat" }, + { + "id": "gemma-3-27b-it", + "name": "gemma-3-27b-it", + "display_name": "gemma-3-27b-it", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131000, + "output": 131000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, { "id": "deepseek-r1-0528", "name": "DeepSeek R1 0528", @@ -190686,6 +197104,91 @@ "last_updated": "2025-05-28", "type": "chat" }, + { + "id": "llama-3.1-nemotron-ultra-253b-v1", + "name": "llama-3.1-nemotron-ultra-253b-v1", + "display_name": "llama-3.1-nemotron-ultra-253b-v1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-04-07", + "last_updated": "2025-04-07", + "type": "chat" + }, + { + "id": "nvidia-nemotron-3-nano-30b-a3b", + "name": "nvidia-nemotron-3-nano-30b-a3b", + "display_name": "nvidia-nemotron-3-nano-30b-a3b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-01-12", + "last_updated": "2026-01-12", + "type": "chat" + }, + { + "id": "nova-2-lite", + "name": "nova-2-lite", + "display_name": "nova-2-lite", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-04", + "last_updated": "2025-12-04", + "type": "chat" + }, { "id": "gpt-5.4", "name": "GPT-5.4", @@ -190693,8 +197196,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -190702,7 +197204,7 @@ }, "limit": { "context": 1050000, - "output": 128000 + "output": 1050000 }, "temperature": false, "tool_call": true, @@ -190740,9 +197242,9 @@ "type": "chat" }, { - "id": "glm-4.5", - "name": "GLM 4.5", - "display_name": "GLM 4.5", + "id": "cosmos3-super-reasoner", + "name": "cosmos3-super-reasoner", + "display_name": "cosmos3-super-reasoner", "modalities": { "input": [ "text" @@ -190752,37 +197254,25 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 256000, + "output": 256000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-29", - "last_updated": "2025-07-29", + "open_weights": false, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "deepseek-v3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -190792,19 +197282,31 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { @@ -190849,7 +197351,7 @@ ] }, "limit": { - "context": 131000, + "context": 262000, "output": 131000 }, "temperature": true, @@ -190872,8 +197374,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -190881,7 +197382,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, "temperature": false, "tool_call": true, @@ -190897,37 +197398,39 @@ "type": "chat" }, { - "id": "codestral-2508", - "name": "Codestral 2508", - "display_name": "Codestral 2508", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen-2.5-72b-instruct", - "name": "Qwen2.5 72B Instruct", - "display_name": "Qwen2.5 72B Instruct", + "id": "codestral-2508", + "name": "Codestral 2508", + "display_name": "Codestral 2508", "modalities": { "input": [ "text" @@ -190937,8 +197440,8 @@ ] }, "limit": { - "context": 33000, - "output": 33000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -190947,81 +197450,104 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "knowledge": "2025-03", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "llama-4-maverick", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4 (latest)", + "display_name": "Claude Sonnet 4 (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "intellect-3", - "name": "INTELLECT 3", - "display_name": "INTELLECT 3", + "id": "mistral-small-2503", + "name": "mistral-small-2503", + "display_name": "mistral-small-2503", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -191031,69 +197557,51 @@ "context": 128000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-11", - "release_date": "2025-11-26", - "last_updated": "2025-11-26", + "open_weights": false, + "release_date": "2025-03-20", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { @@ -191116,9 +197624,10 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2024-04", "release_date": "2024-12-03", @@ -191127,8 +197636,8 @@ }, { "id": "glm-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -191138,7 +197647,7 @@ ] }, "limit": { - "context": 198000, + "context": 202752, "output": 198000 }, "temperature": true, @@ -191167,8 +197676,8 @@ }, { "id": "gpt-oss-120b", - "name": "GPT Oss 120b", - "display_name": "GPT Oss 120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -191178,7 +197687,7 @@ ] }, "limit": { - "context": 128000, + "context": 131000, "output": 128000 }, "temperature": true, @@ -191194,7 +197703,6 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-01", "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" @@ -191212,7 +197720,7 @@ ] }, "limit": { - "context": 196608, + "context": 196680, "output": 196608 }, "temperature": true, @@ -191273,11 +197781,124 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-11", "release_date": "2025-10-27", "last_updated": "2025-10-27", "type": "chat" }, + { + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 1050000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 262000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, + { + "id": "hermes-4-405b", + "name": "hermes-4-405b", + "display_name": "hermes-4-405b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-08-13", + "last_updated": "2024-08-13", + "type": "chat" + }, { "id": "claude-opus4-6", "name": "Claude Opus 4.6", @@ -191285,8 +197906,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -191309,6 +197929,84 @@ "last_updated": "2026-03-13", "type": "chat" }, + { + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 400000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "mistral-7b-instruct-v0.2", + "name": "mistral-7b-instruct-v0.2", + "display_name": "mistral-7b-instruct-v0.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 32000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", + "type": "chat" + }, { "id": "kimi-k2.7-code", "name": "Kimi K2.7 Code", @@ -191316,8 +198014,7 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -191351,15 +198048,71 @@ "last_updated": "2026-06-12", "type": "chat" }, + { + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "mistral-small-3.2-24b-instruct-2506", + "display_name": "mistral-small-3.2-24b-instruct-2506", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131000, + "output": 131000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", + "type": "chat" + }, + { + "id": "nova-micro-v1", + "name": "nova-micro-v1", + "display_name": "nova-micro-v1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, { "id": "claude-opus4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -191377,15 +198130,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", + "knowledge": "2025-05", "release_date": "2025-11-24", "last_updated": "2025-11-24", "type": "chat" }, { - "id": "devstral-2512", - "name": "Devstral 2 2512", - "display_name": "Devstral 2 2512", + "id": "nvidia-nemotron-3-nano-omni", + "name": "nvidia-nemotron-3-nano-omni", + "display_name": "nvidia-nemotron-3-nano-omni", "modalities": { "input": [ "text" @@ -191395,59 +198148,155 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 300000, + "output": 300000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "open_weights": false, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 400000, + "output": 400000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" + }, + { + "id": "qwen3-30b-a3b-instruct-2507", + "name": "qwen3-30b-a3b-instruct-2507", + "display_name": "qwen3-30b-a3b-instruct-2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 262000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "nova-lite-v1", + "name": "nova-lite-v1", + "display_name": "nova-lite-v1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 300000, + "output": 300000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 262000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": true, "knowledge": "2025-12", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { @@ -191457,7 +198306,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" @@ -191492,10 +198342,10 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-03-20", + "release_date": "2025-06-17", "last_updated": "2025-06-17", "type": "chat" }, @@ -191514,7 +198364,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -191540,9 +198390,9 @@ "type": "chat" }, { - "id": "kimi-k2-instruct", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "llama-3.1-8b-instruct", + "name": "llama-3.1-8b-instruct", + "display_name": "llama-3.1-8b-instruct", "modalities": { "input": [ "text" @@ -191552,19 +198402,70 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 128000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-07-11", - "last_updated": "2025-09-05", + "open_weights": false, + "release_date": "2024-04-09", + "last_updated": "2024-04-09", + "type": "chat" + }, + { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 400000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { @@ -191580,8 +198481,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -191607,17 +198508,15 @@ "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -191633,8 +198532,8 @@ }, { "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text" @@ -191644,7 +198543,7 @@ ] }, "limit": { - "context": 250000, + "context": 262000, "output": 250000 }, "temperature": true, @@ -191666,28 +198565,67 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", + "type": "chat" + }, + { + "id": "minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 196000, + "output": 196000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196000, - "output": 196000 + "context": 1050000, + "output": 1050000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -191696,24 +198634,72 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { "id": "gpt-4.1", - "name": "GPT 4.1", - "display_name": "GPT 4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -191725,20 +198711,47 @@ }, "limit": { "context": 1047576, - "output": 32768 + "output": 1047576 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-06", + "knowledge": "2024-04", "release_date": "2025-04-14", "last_updated": "2025-04-14", "type": "chat" }, + { + "id": "qwen3guard-gen-0.6b", + "name": "qwen3guard-gen-0.6b", + "display_name": "qwen3guard-gen-0.6b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 32000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", + "type": "chat" + }, { "id": "llama-3.1-405b-instruct", "name": "Llama 3.1 405B Instruct", @@ -191758,7 +198771,8 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, @@ -191767,6 +198781,41 @@ "last_updated": "2024-07-23", "type": "chat" }, + { + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", + "type": "chat" + }, { "id": "qwen3-coder-next", "name": "Qwen3 Coder Next 80B", @@ -191796,10 +198845,37 @@ "last_updated": "2026-02-04", "type": "chat" }, + { + "id": "mistral-7b-instruct-v0.3", + "name": "mistral-7b-instruct-v0.3", + "display_name": "mistral-7b-instruct-v0.3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 127000, + "output": 127000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", + "type": "chat" + }, { "id": "qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B", - "display_name": "Qwen3.5 122B A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text" @@ -191831,9 +198907,8 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { @@ -191855,8 +198930,7 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, @@ -191867,13 +198941,12 @@ }, { "id": "claude-4-5-sonnet", - "name": "Claude 4.5 Sonnet", - "display_name": "Claude 4.5 Sonnet", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -191898,8 +198971,8 @@ }, { "id": "mistral-large-2512", - "name": "Mistral Large 3 2512", - "display_name": "Mistral Large 3 2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", @@ -191920,9 +198993,38 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "qwen2.5-vl-72b-instruct", + "name": "qwen2.5-vl-72b-instruct", + "display_name": "qwen2.5-vl-72b-instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 32000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" } ] @@ -207558,6 +214660,35 @@ "last_updated": "2026-04-24", "type": "chat" }, + { + "id": "deepseek-v4-flash:0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, { "id": "minimax-m2.5", "name": "minimax-m2.5", @@ -211408,7 +218539,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211433,7 +218564,32 @@ "default": true }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", + "type": "chat" + }, + { + "id": "deepseek-v4-flash-ga-260731", + "name": "deepseek-v4-flash-ga-260731", + "display_name": "deepseek-v4-flash-ga-260731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1024000, + "output": 384000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211458,7 +218614,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211482,7 +218638,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211506,7 +218662,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211530,7 +218686,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211555,7 +218711,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211580,7 +218736,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "embedding" }, { @@ -211605,7 +218761,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "embedding" }, { @@ -211631,7 +218787,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211657,7 +218813,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211683,7 +218839,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211709,7 +218865,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211735,7 +218891,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211761,7 +218917,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211787,7 +218943,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211813,7 +218969,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211839,7 +218995,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211865,7 +219021,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211891,7 +219047,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211917,7 +219073,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211943,7 +219099,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211969,7 +219125,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -211993,7 +219149,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -212019,7 +219175,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -212045,7 +219201,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -212071,7 +219227,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -212095,7 +219251,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -212116,7 +219272,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z" + "last_updated": "2026-08-05T09:07:36Z" }, { "id": "doubao-seedance-1-0-pro-fast-251015", @@ -212136,7 +219292,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z" + "last_updated": "2026-08-05T09:07:36Z" }, { "id": "doubao-seedance-1-5-pro-251215", @@ -212157,7 +219313,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z" + "last_updated": "2026-08-05T09:07:36Z" }, { "id": "doubao-seedance-2-0-260128", @@ -212179,7 +219335,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z" + "last_updated": "2026-08-05T09:07:36Z" }, { "id": "doubao-seedance-2-0-fast-260128", @@ -212201,7 +219357,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z" + "last_updated": "2026-08-05T09:07:36Z" }, { "id": "doubao-seedance-2-0-mini-260615", @@ -212223,7 +219379,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z" + "last_updated": "2026-08-05T09:07:36Z" }, { "id": "doubao-seedream-4-0-250828", @@ -212243,7 +219399,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "imageGeneration" }, { @@ -212264,7 +219420,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "imageGeneration" }, { @@ -212285,7 +219441,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "imageGeneration" }, { @@ -212306,7 +219462,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "imageGeneration" }, { @@ -212331,7 +219487,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" }, { @@ -212356,7 +219512,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-07-20T09:28:20Z", + "last_updated": "2026-08-05T09:07:36Z", "type": "chat" } ] @@ -212533,6 +219689,26 @@ }, "type": "chat" }, + { + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", + "limit": { + "context": 1000000, + "output": 131072 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "xiaomimimo/mimo-v2.5", "name": "XiaomiMiMo/MiMo-V2.5", @@ -213954,6 +221130,21 @@ }, "type": "chat" }, + { + "id": "pprouter/fusion", + "name": "pprouter/fusion", + "display_name": "pprouter/fusion", + "limit": { + "context": 1048576, + "output": 393216 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, { "id": "pprouter/mom", "name": "pprouter/mom", @@ -214296,37 +221487,9 @@ "type": "chat" }, { - "id": "anthropic/claude-3.5-haiku", - "name": "anthropic/claude-3.5-haiku", - "display_name": "anthropic/claude-3.5-haiku", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "anthropic/claude-3.5-sonnet", - "display_name": "anthropic/claude-3.5-sonnet", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "anthropic/claude-3.7-sonnet", - "display_name": "anthropic/claude-3.7-sonnet", + "id": "anthropic/claude-fable-5", + "name": "anthropic/claude-fable-5", + "display_name": "anthropic/claude-fable-5", "limit": { "context": 4096, "output": 4096 @@ -214334,25 +221497,31 @@ "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic uses thinking budget tokens" + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, @@ -214551,6 +221720,203 @@ }, "type": "chat" }, + { + "id": "anthropic/claude-opus-4.7", + "name": "anthropic/claude-opus-4.7", + "display_name": "anthropic/claude-opus-4.7", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "type": "chat" + }, + { + "id": "anthropic/claude-opus-4.7-fast", + "name": "anthropic/claude-opus-4.7-fast", + "display_name": "anthropic/claude-opus-4.7-fast", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "type": "chat" + }, + { + "id": "anthropic/claude-opus-4.8", + "name": "anthropic/claude-opus-4.8", + "display_name": "anthropic/claude-opus-4.8", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "type": "chat" + }, + { + "id": "anthropic/claude-opus-4.8-fast", + "name": "anthropic/claude-opus-4.8-fast", + "display_name": "anthropic/claude-opus-4.8-fast", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "type": "chat" + }, + { + "id": "anthropic/claude-opus-5", + "name": "anthropic/claude-opus-5", + "display_name": "anthropic/claude-opus-5", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "anthropic/claude-opus-5-fast", + "name": "anthropic/claude-opus-5-fast", + "display_name": "anthropic/claude-opus-5-fast", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "anthropic/claude-sonnet-4", "name": "anthropic/claude-sonnet-4", @@ -214666,6 +222032,25 @@ }, "type": "chat" }, + { + "id": "anthropic/claude-sonnet-5", + "name": "anthropic/claude-sonnet-5", + "display_name": "anthropic/claude-sonnet-5", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "deepseek/deepseek-chat", "name": "deepseek/deepseek-chat", @@ -214806,44 +222191,71 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-speciale", - "name": "deepseek/deepseek-v3.2-speciale", - "display_name": "deepseek/deepseek-v3.2-speciale", + "id": "deepseek/deepseek-v4-flash", + "name": "deepseek/deepseek-v4-flash", + "display_name": "deepseek/deepseek-v4-flash", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "type": "chat" }, { - "id": "google/gemini-2.0-flash-001", - "name": "google/gemini-2.0-flash-001", - "display_name": "google/gemini-2.0-flash-001", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "deepseek/deepseek-v4-flash-0731", + "display_name": "deepseek/deepseek-v4-flash-0731", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "type": "chat" }, { - "id": "google/gemini-2.0-flash-lite-001", - "name": "google/gemini-2.0-flash-lite-001", - "display_name": "google/gemini-2.0-flash-lite-001", + "id": "deepseek/deepseek-v4-pro", + "name": "deepseek/deepseek-v4-pro", + "display_name": "deepseek/deepseek-v4-pro", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "type": "chat" }, @@ -214931,9 +222343,9 @@ "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite-preview-09-2025", - "name": "google/gemini-2.5-flash-lite-preview-09-2025", - "display_name": "google/gemini-2.5-flash-lite-preview-09-2025", + "id": "google/gemini-2.5-pro", + "name": "google/gemini-2.5-pro", + "display_name": "google/gemini-2.5-pro", "limit": { "context": 4096, "output": 4096 @@ -214941,17 +222353,17 @@ "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { "default": -1, - "min": 512, - "max": 24576, + "min": 128, + "max": 32768, "auto": -1, "unit": "tokens" }, @@ -214965,9 +222377,9 @@ "type": "chat" }, { - "id": "google/gemini-2.5-flash-preview-09-2025", - "name": "google/gemini-2.5-flash-preview-09-2025", - "display_name": "google/gemini-2.5-flash-preview-09-2025", + "id": "google/gemini-2.5-pro-preview", + "name": "google/gemini-2.5-pro-preview", + "display_name": "google/gemini-2.5-pro-preview", "limit": { "context": 4096, "output": 4096 @@ -214984,10 +222396,9 @@ "mode": "budget", "budget": { "default": -1, - "min": 0, - "max": 24576, + "min": 128, + "max": 32768, "auto": -1, - "off": 0, "unit": "tokens" }, "summaries": true, @@ -215000,9 +222411,9 @@ "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "google/gemini-2.5-pro", - "display_name": "google/gemini-2.5-pro", + "id": "google/gemini-2.5-pro-preview-05-06", + "name": "google/gemini-2.5-pro-preview-05-06", + "display_name": "google/gemini-2.5-pro-preview-05-06", "limit": { "context": 4096, "output": 4096 @@ -215034,9 +222445,9 @@ "type": "chat" }, { - "id": "google/gemini-2.5-pro-preview", - "name": "google/gemini-2.5-pro-preview", - "display_name": "google/gemini-2.5-pro-preview", + "id": "google/gemini-3-flash-preview", + "name": "google/gemini-3-flash-preview", + "display_name": "google/gemini-3-flash-preview", "limit": { "context": 4096, "output": 4096 @@ -215050,14 +222461,14 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ @@ -215068,9 +222479,9 @@ "type": "chat" }, { - "id": "google/gemini-2.5-pro-preview-05-06", - "name": "google/gemini-2.5-pro-preview-05-06", - "display_name": "google/gemini-2.5-pro-preview-05-06", + "id": "google/gemini-3-pro-image", + "name": "google/gemini-3-pro-image", + "display_name": "google/gemini-3-pro-image", "limit": { "context": 4096, "output": 4096 @@ -215084,14 +222495,12 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ @@ -215102,9 +222511,9 @@ "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "google/gemini-3-flash-preview", - "display_name": "google/gemini-3-flash-preview", + "id": "google/gemini-3-pro-image-preview", + "name": "google/gemini-3-pro-image-preview", + "display_name": "google/gemini-3-pro-image-preview", "limit": { "context": 4096, "output": 4096 @@ -215121,9 +222530,7 @@ "mode": "level", "level": "high", "level_options": [ - "minimal", "low", - "medium", "high" ], "summaries": true, @@ -215136,9 +222543,104 @@ "type": "chat" }, { - "id": "google/gemini-3-pro-image-preview", - "name": "google/gemini-3-pro-image-preview", - "display_name": "google/gemini-3-pro-image-preview", + "id": "google/gemini-3.1-flash-image", + "name": "google/gemini-3.1-flash-image", + "display_name": "google/gemini-3.1-flash-image", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/gemini-3.1-flash-image-preview", + "name": "google/gemini-3.1-flash-image-preview", + "display_name": "google/gemini-3.1-flash-image-preview", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/gemini-3.1-flash-lite", + "name": "google/gemini-3.1-flash-lite", + "display_name": "google/gemini-3.1-flash-lite", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/gemini-3.1-flash-lite-image", + "name": "google/gemini-3.1-flash-lite-image", + "display_name": "google/gemini-3.1-flash-lite-image", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/gemini-3.1-flash-lite-preview", + "name": "google/gemini-3.1-flash-lite-preview", + "display_name": "google/gemini-3.1-flash-lite-preview", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/gemini-3.1-pro-preview", + "name": "google/gemini-3.1-pro-preview", + "display_name": "google/gemini-3.1-pro-preview", "limit": { "context": 4096, "output": 4096 @@ -215168,9 +222670,9 @@ "type": "chat" }, { - "id": "google/gemini-3-pro-preview", - "name": "google/gemini-3-pro-preview", - "display_name": "google/gemini-3-pro-preview", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "google/gemini-3.1-pro-preview-customtools", + "display_name": "google/gemini-3.1-pro-preview-customtools", "limit": { "context": 4096, "output": 4096 @@ -215200,23 +222702,96 @@ "type": "chat" }, { - "id": "google/gemma-2-27b-it", - "name": "google/gemma-2-27b-it", - "display_name": "google/gemma-2-27b-it", + "id": "google/gemini-3.5-flash", + "name": "google/gemini-3.5-flash", + "display_name": "google/gemini-3.5-flash", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "type": "chat" + }, + { + "id": "google/gemini-3.5-flash-lite", + "name": "google/gemini-3.5-flash-lite", + "display_name": "google/gemini-3.5-flash-lite", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "type": "chat" }, { - "id": "google/gemma-2-9b-it", - "name": "google/gemma-2-9b-it", - "display_name": "google/gemma-2-9b-it", + "id": "google/gemini-3.6-flash", + "name": "google/gemini-3.6-flash", + "display_name": "google/gemini-3.6-flash", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "type": "chat" + }, + { + "id": "google/gemma-2-27b-it", + "name": "google/gemma-2-27b-it", + "display_name": "google/gemma-2-27b-it", "limit": { "context": 4096, "output": 4096 @@ -215283,6 +222858,72 @@ }, "type": "chat" }, + { + "id": "google/gemma-4-26b-a4b-it", + "name": "google/gemma-4-26b-a4b-it", + "display_name": "google/gemma-4-26b-a4b-it", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/gemma-4-31b-it", + "name": "google/gemma-4-31b-it", + "display_name": "google/gemma-4-31b-it", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "google/lyria-3-clip-preview", + "name": "google/lyria-3-clip-preview", + "display_name": "google/lyria-3-clip-preview", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "google/lyria-3-pro-preview", + "name": "google/lyria-3-pro-preview", + "display_name": "google/lyria-3-pro-preview", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "minimax/minimax-01", "name": "minimax/minimax-01", @@ -215382,6 +223023,50 @@ }, "type": "chat" }, + { + "id": "minimax/minimax-m2.7", + "name": "minimax/minimax-m2.7", + "display_name": "minimax/minimax-m2.7", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, + { + "id": "minimax/minimax-m3", + "name": "minimax/minimax-m3", + "display_name": "minimax/minimax-m3", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "moonshotai/kimi-k2", "name": "moonshotai/kimi-k2", @@ -215460,6 +223145,63 @@ }, "type": "chat" }, + { + "id": "moonshotai/kimi-k2.6", + "name": "moonshotai/kimi-k2.6", + "display_name": "moonshotai/kimi-k2.6", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "moonshotai/kimi-k2.7-code", + "name": "moonshotai/kimi-k2.7-code", + "display_name": "moonshotai/kimi-k2.7-code", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "moonshotai/kimi-k3", + "name": "moonshotai/kimi-k3", + "display_name": "moonshotai/kimi-k3", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "morph/morph-v3-fast", "name": "morph/morph-v3-fast", @@ -215558,34 +223300,6 @@ }, "type": "chat" }, - { - "id": "openai/gpt-4-0314", - "name": "openai/gpt-4-0314", - "display_name": "openai/gpt-4-0314", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "openai/gpt-4-1106-preview", - "name": "openai/gpt-4-1106-preview", - "display_name": "openai/gpt-4-1106-preview", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "openai/gpt-4-turbo", "name": "openai/gpt-4-turbo", @@ -215712,20 +223426,6 @@ }, "type": "chat" }, - { - "id": "openai/gpt-4o-audio-preview", - "name": "openai/gpt-4o-audio-preview", - "display_name": "openai/gpt-4o-audio-preview", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "openai/gpt-4o-mini", "name": "openai/gpt-4o-mini", @@ -215754,34 +223454,6 @@ }, "type": "chat" }, - { - "id": "openai/gpt-4o-mini-search-preview", - "name": "openai/gpt-4o-mini-search-preview", - "display_name": "openai/gpt-4o-mini-search-preview", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "openai/gpt-4o-search-preview", - "name": "openai/gpt-4o-search-preview", - "display_name": "openai/gpt-4o-search-preview", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "openai/gpt-5", "name": "openai/gpt-5", @@ -215818,56 +223490,6 @@ }, "type": "chat" }, - { - "id": "openai/gpt-5-chat", - "name": "openai/gpt-5-chat", - "display_name": "openai/gpt-5-chat", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "openai/gpt-5-codex", - "name": "openai/gpt-5-codex", - "display_name": "openai/gpt-5-codex", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "type": "chat" - }, { "id": "openai/gpt-5-image", "name": "openai/gpt-5-image", @@ -216034,20 +223656,6 @@ }, "type": "chat" }, - { - "id": "openai/gpt-5.1-chat", - "name": "openai/gpt-5.1-chat", - "display_name": "openai/gpt-5.1-chat", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "openai/gpt-5.1-codex", "name": "openai/gpt-5.1-codex", @@ -216279,9 +223887,9 @@ "type": "chat" }, { - "id": "openai/gpt-audio", - "name": "openai/gpt-audio", - "display_name": "openai/gpt-audio", + "id": "openai/gpt-5.3-chat", + "name": "openai/gpt-5.3-chat", + "display_name": "openai/gpt-5.3-chat", "limit": { "context": 4096, "output": 4096 @@ -216293,75 +223901,193 @@ "type": "chat" }, { - "id": "openai/gpt-audio-mini", - "name": "openai/gpt-audio-mini", - "display_name": "openai/gpt-audio-mini", + "id": "openai/gpt-5.3-codex", + "name": "openai/gpt-5.3-codex", + "display_name": "openai/gpt-5.3-codex", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "openai/gpt-oss-120b", - "display_name": "openai/gpt-oss-120b", + "id": "openai/gpt-5.4", + "name": "openai/gpt-5.4", + "display_name": "openai/gpt-5.4", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "openai/gpt-oss-20b", - "display_name": "openai/gpt-oss-20b", + "id": "openai/gpt-5.4-image-2", + "name": "openai/gpt-5.4-image-2", + "display_name": "openai/gpt-5.4-image-2", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-20b", - "name": "openai/gpt-oss-safeguard-20b", - "display_name": "openai/gpt-oss-safeguard-20b", + "id": "openai/gpt-5.4-mini", + "name": "openai/gpt-5.4-mini", + "display_name": "openai/gpt-5.4-mini", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "type": "chat" }, { - "id": "openai/o1", - "name": "openai/o1", - "display_name": "openai/o1", + "id": "openai/gpt-5.4-nano", + "name": "openai/gpt-5.4-nano", + "display_name": "openai/gpt-5.4-nano", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "type": "chat" + }, + { + "id": "openai/gpt-5.4-pro", + "name": "openai/gpt-5.4-pro", + "display_name": "openai/gpt-5.4-pro", "limit": { "context": 4096, "output": 4096 @@ -216376,8 +224102,14 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -216388,9 +224120,9 @@ "type": "chat" }, { - "id": "openai/o1-pro", - "name": "openai/o1-pro", - "display_name": "openai/o1-pro", + "id": "openai/gpt-5.5", + "name": "openai/gpt-5.5", + "display_name": "openai/gpt-5.5", "limit": { "context": 4096, "output": 4096 @@ -216407,6 +224139,13 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -216417,9 +224156,28 @@ "type": "chat" }, { - "id": "openai/o3", - "name": "openai/o3", - "display_name": "openai/o3", + "id": "openai/gpt-5.5-pro", + "name": "openai/gpt-5.5-pro", + "display_name": "openai/gpt-5.5-pro", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "openai/gpt-5.6-luna", + "name": "openai/gpt-5.6-luna", + "display_name": "openai/gpt-5.6-luna", "limit": { "context": 4096, "output": 4096 @@ -216436,6 +224194,15 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -216446,9 +224213,23 @@ "type": "chat" }, { - "id": "openai/o3-deep-research", - "name": "openai/o3-deep-research", - "display_name": "openai/o3-deep-research", + "id": "openai/gpt-5.6-luna-pro", + "name": "openai/gpt-5.6-luna-pro", + "display_name": "openai/gpt-5.6-luna-pro", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "openai/gpt-5.6-sol", + "name": "openai/gpt-5.6-sol", + "display_name": "openai/gpt-5.6-sol", "limit": { "context": 4096, "output": 4096 @@ -216465,6 +224246,15 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -216475,9 +224265,23 @@ "type": "chat" }, { - "id": "openai/o3-mini", - "name": "openai/o3-mini", - "display_name": "openai/o3-mini", + "id": "openai/gpt-5.6-sol-pro", + "name": "openai/gpt-5.6-sol-pro", + "display_name": "openai/gpt-5.6-sol-pro", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "openai/gpt-5.6-terra", + "name": "openai/gpt-5.6-terra", + "display_name": "openai/gpt-5.6-terra", "limit": { "context": 4096, "output": 4096 @@ -216494,6 +224298,15 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -216504,9 +224317,122 @@ "type": "chat" }, { - "id": "openai/o3-mini-high", - "name": "openai/o3-mini-high", - "display_name": "openai/o3-mini-high", + "id": "openai/gpt-5.6-terra-pro", + "name": "openai/gpt-5.6-terra-pro", + "display_name": "openai/gpt-5.6-terra-pro", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "openai/gpt-audio", + "name": "openai/gpt-audio", + "display_name": "openai/gpt-audio", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "openai/gpt-audio-mini", + "name": "openai/gpt-audio-mini", + "display_name": "openai/gpt-audio-mini", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "openai/gpt-chat-latest", + "name": "openai/gpt-chat-latest", + "display_name": "openai/gpt-chat-latest", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "openai/gpt-oss-120b", + "name": "openai/gpt-oss-120b", + "display_name": "openai/gpt-oss-120b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "openai/gpt-oss-20b", + "name": "openai/gpt-oss-20b", + "display_name": "openai/gpt-oss-20b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "openai/gpt-oss-safeguard-20b", + "display_name": "openai/gpt-oss-safeguard-20b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "openai/o1", + "name": "openai/o1", + "display_name": "openai/o1", "limit": { "context": 4096, "output": 4096 @@ -216533,9 +224459,9 @@ "type": "chat" }, { - "id": "openai/o3-pro", - "name": "openai/o3-pro", - "display_name": "openai/o3-pro", + "id": "openai/o1-pro", + "name": "openai/o1-pro", + "display_name": "openai/o1-pro", "limit": { "context": 4096, "output": 4096 @@ -216562,9 +224488,9 @@ "type": "chat" }, { - "id": "openai/o4-mini", - "name": "openai/o4-mini", - "display_name": "openai/o4-mini", + "id": "openai/o3", + "name": "openai/o3", + "display_name": "openai/o3", "limit": { "context": 4096, "output": 4096 @@ -216591,9 +224517,9 @@ "type": "chat" }, { - "id": "openai/o4-mini-deep-research", - "name": "openai/o4-mini-deep-research", - "display_name": "openai/o4-mini-deep-research", + "id": "openai/o3-mini", + "name": "openai/o3-mini", + "display_name": "openai/o3-mini", "limit": { "context": 4096, "output": 4096 @@ -216620,9 +224546,9 @@ "type": "chat" }, { - "id": "openai/o4-mini-high", - "name": "openai/o4-mini-high", - "display_name": "openai/o4-mini-high", + "id": "openai/o3-mini-high", + "name": "openai/o3-mini-high", + "display_name": "openai/o3-mini-high", "limit": { "context": 4096, "output": 4096 @@ -216649,51 +224575,96 @@ "type": "chat" }, { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "qwen/qwen-2.5-72b-instruct", - "display_name": "qwen/qwen-2.5-72b-instruct", + "id": "openai/o3-pro", + "name": "openai/o3-pro", + "display_name": "openai/o3-pro", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "type": "chat" }, { - "id": "qwen/qwen-2.5-7b-instruct", - "name": "qwen/qwen-2.5-7b-instruct", - "display_name": "qwen/qwen-2.5-7b-instruct", + "id": "openai/o4-mini", + "name": "openai/o4-mini", + "display_name": "openai/o4-mini", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "type": "chat" }, { - "id": "qwen/qwen-2.5-coder-32b-instruct", - "name": "qwen/qwen-2.5-coder-32b-instruct", - "display_name": "qwen/qwen-2.5-coder-32b-instruct", + "id": "openai/o4-mini-high", + "name": "openai/o4-mini-high", + "display_name": "openai/o4-mini-high", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "type": "chat" }, { - "id": "qwen/qwen-2.5-vl-7b-instruct", - "name": "qwen/qwen-2.5-vl-7b-instruct", - "display_name": "qwen/qwen-2.5-vl-7b-instruct", + "id": "qwen/qwen-2.5-72b-instruct", + "name": "qwen/qwen-2.5-72b-instruct", + "display_name": "qwen/qwen-2.5-72b-instruct", "limit": { "context": 4096, "output": 4096 @@ -216705,9 +224676,9 @@ "type": "chat" }, { - "id": "qwen/qwen-max", - "name": "qwen/qwen-max", - "display_name": "qwen/qwen-max", + "id": "qwen/qwen-2.5-7b-instruct", + "name": "qwen/qwen-2.5-7b-instruct", + "display_name": "qwen/qwen-2.5-7b-instruct", "limit": { "context": 4096, "output": 4096 @@ -216719,34 +224690,23 @@ "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "qwen/qwen-plus", - "display_name": "qwen/qwen-plus", + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "qwen/qwen-2.5-coder-32b-instruct", + "display_name": "qwen/qwen-2.5-coder-32b-instruct", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "type": "chat" }, { - "id": "qwen/qwen-plus-2025-07-28", - "name": "qwen/qwen-plus-2025-07-28", - "display_name": "qwen/qwen-plus-2025-07-28", + "id": "qwen/qwen-plus", + "name": "qwen/qwen-plus", + "display_name": "qwen/qwen-plus", "limit": { "context": 4096, "output": 4096 @@ -216769,9 +224729,9 @@ "type": "chat" }, { - "id": "qwen/qwen-turbo", - "name": "qwen/qwen-turbo", - "display_name": "qwen/qwen-turbo", + "id": "qwen/qwen-plus-2025-07-28", + "name": "qwen/qwen-plus-2025-07-28", + "display_name": "qwen/qwen-plus-2025-07-28", "limit": { "context": 4096, "output": 4096 @@ -216793,62 +224753,6 @@ }, "type": "chat" }, - { - "id": "qwen/qwen-vl-max", - "name": "qwen/qwen-vl-max", - "display_name": "qwen/qwen-vl-max", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "qwen/qwen-vl-plus", - "name": "qwen/qwen-vl-plus", - "display_name": "qwen/qwen-vl-plus", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "qwen/qwen2.5-coder-7b-instruct", - "name": "qwen/qwen2.5-coder-7b-instruct", - "display_name": "qwen/qwen2.5-coder-7b-instruct", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "qwen/qwen2.5-vl-32b-instruct", - "name": "qwen/qwen2.5-vl-32b-instruct", - "display_name": "qwen/qwen2.5-vl-32b-instruct", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "qwen/qwen2.5-vl-72b-instruct", "name": "qwen/qwen2.5-vl-72b-instruct", @@ -217041,31 +224945,6 @@ }, "type": "chat" }, - { - "id": "qwen/qwen3-4b", - "name": "qwen/qwen3-4b", - "display_name": "qwen/qwen3-4b", - "limit": { - "context": 4096, - "output": 4096 - }, - "tool_call": false, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "type": "chat" - }, { "id": "qwen/qwen3-8b", "name": "qwen/qwen3-8b", @@ -217381,6 +225260,81 @@ }, "type": "chat" }, + { + "id": "qwen/qwen3.5-122b-a10b", + "name": "qwen/qwen3.5-122b-a10b", + "display_name": "qwen/qwen3.5-122b-a10b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, + { + "id": "qwen/qwen3.5-27b", + "name": "qwen/qwen3.5-27b", + "display_name": "qwen/qwen3.5-27b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, + { + "id": "qwen/qwen3.5-35b-a3b", + "name": "qwen/qwen3.5-35b-a3b", + "display_name": "qwen/qwen3.5-35b-a3b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, { "id": "qwen/qwen3.5-397b-a17b", "name": "qwen/qwen3.5-397b-a17b", @@ -217406,6 +225360,56 @@ }, "type": "chat" }, + { + "id": "qwen/qwen3.5-9b", + "name": "qwen/qwen3.5-9b", + "display_name": "qwen/qwen3.5-9b", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, + { + "id": "qwen/qwen3.5-flash-02-23", + "name": "qwen/qwen3.5-flash-02-23", + "display_name": "qwen/qwen3.5-flash-02-23", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, { "id": "qwen/qwen3.5-plus-02-15", "name": "qwen/qwen3.5-plus-02-15", @@ -217432,9 +225436,9 @@ "type": "chat" }, { - "id": "qwen/qwq-32b", - "name": "qwen/qwq-32b", - "display_name": "qwen/qwq-32b", + "id": "qwen/qwen3.5-plus-20260420", + "name": "qwen/qwen3.5-plus-20260420", + "display_name": "qwen/qwen3.5-plus-20260420", "limit": { "context": 4096, "output": 4096 @@ -217457,65 +225461,134 @@ "type": "chat" }, { - "id": "x-ai/grok-3", - "name": "x-ai/grok-3", - "display_name": "x-ai/grok-3", + "id": "qwen/qwen3.6-27b", + "name": "qwen/qwen3.6-27b", + "display_name": "qwen/qwen3.6-27b", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "type": "chat" }, { - "id": "x-ai/grok-3-beta", - "name": "x-ai/grok-3-beta", - "display_name": "x-ai/grok-3-beta", + "id": "qwen/qwen3.6-35b-a3b", + "name": "qwen/qwen3.6-35b-a3b", + "display_name": "qwen/qwen3.6-35b-a3b", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "type": "chat" }, { - "id": "x-ai/grok-3-mini", - "name": "x-ai/grok-3-mini", - "display_name": "x-ai/grok-3-mini", + "id": "qwen/qwen3.6-flash", + "name": "qwen/qwen3.6-flash", + "display_name": "qwen/qwen3.6-flash", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "type": "chat" }, { - "id": "x-ai/grok-3-mini-beta", - "name": "x-ai/grok-3-mini-beta", - "display_name": "x-ai/grok-3-mini-beta", + "id": "qwen/qwen3.6-max-preview", + "name": "qwen/qwen3.6-max-preview", + "display_name": "qwen/qwen3.6-max-preview", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "type": "chat" }, { - "id": "x-ai/grok-4", - "name": "x-ai/grok-4", - "display_name": "x-ai/grok-4", + "id": "qwen/qwen3.6-plus", + "name": "qwen/qwen3.6-plus", + "display_name": "qwen/qwen3.6-plus", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, + { + "id": "qwen/qwen3.7-flash", + "name": "qwen/qwen3.7-flash", + "display_name": "qwen/qwen3.7-flash", "limit": { "context": 4096, "output": 4096 @@ -217532,9 +225605,66 @@ "type": "chat" }, { - "id": "x-ai/grok-4-fast", - "name": "x-ai/grok-4-fast", - "display_name": "x-ai/grok-4-fast", + "id": "qwen/qwen3.7-max", + "name": "qwen/qwen3.7-max", + "display_name": "qwen/qwen3.7-max", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "qwen/qwen3.7-plus", + "name": "qwen/qwen3.7-plus", + "display_name": "qwen/qwen3.7-plus", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "qwen/qwen3.8-max", + "name": "qwen/qwen3.8-max", + "display_name": "qwen/qwen3.8-max", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "x-ai/grok-4.20", + "name": "x-ai/grok-4.20", + "display_name": "x-ai/grok-4.20", "limit": { "context": 4096, "output": 4096 @@ -217546,9 +225676,9 @@ "type": "chat" }, { - "id": "x-ai/grok-4.1-fast", - "name": "x-ai/grok-4.1-fast", - "display_name": "x-ai/grok-4.1-fast", + "id": "x-ai/grok-4.20-multi-agent", + "name": "x-ai/grok-4.20-multi-agent", + "display_name": "x-ai/grok-4.20-multi-agent", "limit": { "context": 4096, "output": 4096 @@ -217560,9 +225690,9 @@ "type": "chat" }, { - "id": "x-ai/grok-code-fast-1", - "name": "x-ai/grok-code-fast-1", - "display_name": "x-ai/grok-code-fast-1", + "id": "x-ai/grok-4.3", + "name": "x-ai/grok-4.3", + "display_name": "x-ai/grok-4.3", "limit": { "context": 4096, "output": 4096 @@ -217579,16 +225709,40 @@ "type": "chat" }, { - "id": "z-ai/glm-4-32b", - "name": "z-ai/glm-4-32b", - "display_name": "z-ai/glm-4-32b", + "id": "x-ai/grok-4.5", + "name": "x-ai/grok-4.5", + "display_name": "x-ai/grok-4.5", "limit": { "context": 4096, "output": 4096 }, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "x-ai/grok-build-0.1", + "name": "x-ai/grok-build-0.1", + "display_name": "x-ai/grok-build-0.1", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "type": "chat" }, @@ -217735,71 +225889,90 @@ } }, "type": "chat" - } - ] - }, - "custom-provider": { - "id": "custom-provider", - "name": "custom provider", - "display_name": "custom provider", - "doc": "docs/custom-provider.md", - "models": [ + }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] + "id": "z-ai/glm-5-turbo", + "name": "z-ai/glm-5-turbo", + "display_name": "z-ai/glm-5-turbo", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "z-ai/glm-5.1", + "name": "z-ai/glm-5.1", + "display_name": "z-ai/glm-5.1", "limit": { - "context": 200000, - "output": 64000 + "context": 4096, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "z-ai/glm-5.2", + "name": "z-ai/glm-5.2", + "display_name": "z-ai/glm-5.2", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "z-ai/glm-5v-turbo", + "name": "z-ai/glm-5v-turbo", + "display_name": "z-ai/glm-5v-turbo", + "limit": { + "context": 4096, + "output": 4096 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + } + ] + }, + "custom-provider": { + "id": "custom-provider", + "name": "custom provider", + "display_name": "custom provider", + "doc": "docs/custom-provider.md", + "models": [ + { + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -217818,12 +225991,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -217840,23 +226013,22 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-06-07", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -217868,7 +226040,7 @@ ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 64000 }, "temperature": true, @@ -217881,18 +226053,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -217900,60 +226065,71 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -217963,29 +226139,14 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Compatibility alias for deepseek-v4-flash thinking mode." - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2025-01-20", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-29", + "last_updated": "2026-06-30", "type": "chat" }, { @@ -218001,8 +226162,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -218017,6 +226178,7 @@ "mode": "effort", "effort": "high", "effort_options": [ + "low", "high", "max" ], @@ -218027,13 +226189,15 @@ "thinking_blocks" ], "notes": [ - "Thinking mode is controlled through the thinking parameter; non-thinking mode disables reasoning." + "Thinking mode is enabled by default and supports low, high, and max effort." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "last_updated": "2026-04-24", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { @@ -218049,8 +226213,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -218065,7 +226229,9 @@ "mode": "effort", "effort": "high", "effort_options": [ + "low", "high", + "xhigh", "max" ], "interleaved": true, @@ -218075,12 +226241,14 @@ "thinking_blocks" ], "notes": [ - "Thinking mode is controlled through the thinking parameter; non-thinking mode disables reasoning." + "Thinking mode is enabled by default; low maps to high and xhigh maps to max." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", "last_updated": "2026-04-24", "type": "chat" }, @@ -218137,112 +226305,8 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-03-20", - "last_updated": "2025-06-05", - "type": "chat" - }, - { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", - "type": "chat" - }, - { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash-Lite Preview", - "display_name": "Gemini 3.1 Flash-Lite Preview", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "medium", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { @@ -218296,56 +226360,148 @@ "type": "chat" }, { - "id": "gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", - "type": "chat" - }, - { + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", + "type": "chat" + }, + { + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", + "type": "chat" + }, + { + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", + "type": "chat" + }, + { "id": "glm-4.7", "name": "GLM-4.7", "display_name": "GLM-4.7", @@ -218399,7 +226555,7 @@ ] }, "limit": { - "context": 200000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -218508,7 +226664,8 @@ }, "attachment": false, "open_weights": true, - "last_updated": "2026-06-17", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { @@ -218527,7 +226684,7 @@ ] }, "limit": { - "context": 204800, + "context": 200000, "output": 131072 }, "temperature": true, @@ -218708,8 +226865,8 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { @@ -218761,8 +226918,8 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { @@ -219126,12 +227283,14 @@ "type": "chat" }, { - "id": "kimi-k2-thinking-turbo", - "name": "Kimi K2 Thinking Turbo", - "display_name": "Kimi K2 Thinking Turbo", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -219141,7 +227300,7 @@ "context": 262144, "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -219159,17 +227318,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -219184,7 +227343,7 @@ "context": 262144, "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -219205,14 +227364,14 @@ "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", @@ -219237,6 +227396,7 @@ "reasoning": { "supported": true, "default_enabled": true, + "mode": "fixed", "interleaved": true, "summaries": true, "visibility": "summary", @@ -219253,9 +227413,9 @@ "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -219267,10 +227427,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -219280,7 +227440,13 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -219291,9 +227457,8 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { @@ -219405,20 +227570,62 @@ "type": "chat" }, { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -219438,10 +227645,10 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-01", + "last_updated": "2026-06-25", "type": "chat" } ] @@ -219504,6 +227711,31 @@ }, "type": "chat" }, + { + "id": "deepseek-v4-flash-0731", + "name": "deepseek-v4-flash-0731", + "display_name": "deepseek-v4-flash-0731", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "gpt-5.6-luna", "name": "gpt-5.6-luna", @@ -219684,6 +227916,46 @@ }, "type": "chat" }, + { + "id": "qwen-image-3.0", + "name": "qwen-image-3.0", + "display_name": "qwen-image-3.0", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "imageGeneration" + }, + { + "id": "qwen-image-3.0-pro", + "name": "qwen-image-3.0-pro", + "display_name": "qwen-image-3.0-pro", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "imageGeneration" + }, { "id": "claude-opus-5", "name": "claude-opus-5", @@ -219710,6 +227982,31 @@ }, "type": "chat" }, + { + "id": "qwen3.8-max", + "name": "qwen3.8-max", + "display_name": "qwen3.8-max", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 991000, + "output": 991000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "gemini-3.6-flash", "name": "gemini-3.6-flash", @@ -219753,12 +228050,13 @@ "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "deepseek-v4-flash-0731", - "display_name": "deepseek-v4-flash-0731", + "id": "claude-sonnet-5", + "name": "claude-sonnet-5", + "display_name": "claude-sonnet-5", "modalities": { "input": [ - "text" + "text", + "image" ] }, "limit": { @@ -219854,96 +228152,6 @@ }, "type": "chat" }, - { - "id": "claude-sonnet-5", - "name": "claude-sonnet-5", - "display_name": "claude-sonnet-5", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 1000000, - "output": 1000000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "muse-spark-1.1", - "name": "muse-spark-1.1", - "display_name": "muse-spark-1.1", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ] - }, - "limit": { - "context": 1000000, - "output": 1000000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "qwen-audio-3.0-tts-flash", - "name": "qwen-audio-3.0-tts-flash", - "display_name": "qwen-audio-3.0-tts-flash", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "qwen-audio-3.0-tts-plus", - "name": "qwen-audio-3.0-tts-plus", - "display_name": "qwen-audio-3.0-tts-plus", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, { "id": "gemini-3.1-flash-lite-image", "name": "gemini-3.1-flash-lite-image", @@ -220093,6 +228301,70 @@ }, "type": "chat" }, + { + "id": "muse-spark-1.1", + "name": "muse-spark-1.1", + "display_name": "muse-spark-1.1", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "qwen-audio-3.0-tts-flash", + "name": "qwen-audio-3.0-tts-flash", + "display_name": "qwen-audio-3.0-tts-flash", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "qwen-audio-3.0-tts-plus", + "name": "qwen-audio-3.0-tts-plus", + "display_name": "qwen-audio-3.0-tts-plus", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, { "id": "jina-reranker-v3.5", "name": "jina-reranker-v3.5", @@ -220414,6 +228686,33 @@ }, "type": "chat" }, + { + "id": "coding-kimi-k3", + "name": "coding-kimi-k3", + "display_name": "coding-kimi-k3", + "modalities": { + "input": [ + "text", + "image", + "video" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "happyhorse-1.1-i2v", "name": "happyhorse-1.1-i2v", @@ -220471,33 +228770,6 @@ }, "type": "chat" }, - { - "id": "coding-kimi-k3", - "name": "coding-kimi-k3", - "display_name": "coding-kimi-k3", - "modalities": { - "input": [ - "text", - "image", - "video" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, { "id": "coding-glm-5.2-free", "name": "coding-glm-5.2-free", @@ -220550,60 +228822,6 @@ }, "type": "chat" }, - { - "id": "kimi-k2.7-code", - "name": "kimi-k2.7-code", - "display_name": "kimi-k2.7-code", - "modalities": { - "input": [ - "text", - "image", - "video" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "kimi-k2.7-code-highspeed", - "name": "kimi-k2.7-code-highspeed", - "display_name": "kimi-k2.7-code-highspeed", - "modalities": { - "input": [ - "text", - "image", - "video" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, { "id": "gemini-3.1-flash-image", "name": "gemini-3.1-flash-image", @@ -220655,56 +228873,19 @@ "type": "chat" }, { - "id": "gemini-3-pro-image", - "name": "gemini-3-pro-image", - "display_name": "gemini-3-pro-image", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "imageGeneration" - }, - { - "id": "gpt-4o-transcribe-diarize", - "name": "gpt-4o-transcribe-diarize", - "display_name": "gpt-4o-transcribe-diarize", + "id": "kimi-k2.7-code", + "name": "kimi-k2.7-code", + "display_name": "kimi-k2.7-code", "modalities": { "input": [ "text", - "audio" + "image", + "video" ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 262144, + "output": 262144 }, "tool_call": true, "reasoning": { @@ -220719,18 +228900,19 @@ "type": "chat" }, { - "id": "gpt-audio-1.5", - "name": "gpt-audio-1.5", - "display_name": "gpt-audio-1.5", + "id": "kimi-k2.7-code-highspeed", + "name": "kimi-k2.7-code-highspeed", + "display_name": "kimi-k2.7-code-highspeed", "modalities": { "input": [ "text", - "audio" + "image", + "video" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 262144 }, "tool_call": true, "reasoning": { @@ -220854,42 +229036,56 @@ "type": "chat" }, { - "id": "hy3-preview", - "name": "hy3-preview", - "display_name": "hy3-preview", + "id": "gemini-3-pro-image", + "name": "gemini-3-pro-image", + "display_name": "gemini-3-pro-image", "modalities": { "input": [ - "text" + "text", + "image" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 8192, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "type": "chat" + "type": "imageGeneration" }, { - "id": "minimax-m3", - "name": "minimax-m3", - "display_name": "minimax-m3", + "id": "gpt-4o-transcribe-diarize", + "name": "gpt-4o-transcribe-diarize", + "display_name": "gpt-4o-transcribe-diarize", "modalities": { "input": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 204800, - "output": 204800 + "context": 16000, + "output": 16000 }, "tool_call": true, "reasoning": { @@ -220904,13 +229100,13 @@ "type": "chat" }, { - "id": "nemotron-nano-12b-v2-vl-free", - "name": "nemotron-nano-12b-v2-vl-free", - "display_name": "nemotron-nano-12b-v2-vl-free", + "id": "gpt-audio-1.5", + "name": "gpt-audio-1.5", + "display_name": "gpt-audio-1.5", "modalities": { "input": [ "text", - "image" + "audio" ] }, "limit": { @@ -220919,7 +229115,8 @@ }, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -220999,18 +229196,17 @@ "type": "chat" }, { - "id": "claude-opus-4-8-think", - "name": "claude-opus-4-8-think", - "display_name": "claude-opus-4-8-think", + "id": "hy3-preview", + "name": "hy3-preview", + "display_name": "hy3-preview", "modalities": { "input": [ - "text", - "image" + "text" ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 256000, + "output": 256000 }, "tool_call": true, "reasoning": { @@ -221019,44 +229215,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b-free", - "name": "nemotron-3-super-120b-a12b-free", - "display_name": "nemotron-3-super-120b-a12b-free", + "id": "minimax-m3", + "name": "minimax-m3", + "display_name": "minimax-m3", "modalities": { "input": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 204800 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "nemotron-nano-12b-v2-vl-free", + "name": "nemotron-nano-12b-v2-vl-free", + "display_name": "nemotron-nano-12b-v2-vl-free", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 128000, + "output": 128000 }, "tool_call": true, "reasoning": { @@ -221070,9 +229271,9 @@ "type": "chat" }, { - "id": "laguna-m.1-free", - "name": "laguna-m.1-free", - "display_name": "laguna-m.1-free", + "id": "nemotron-3-super-120b-a12b-free", + "name": "nemotron-3-super-120b-a12b-free", + "display_name": "nemotron-3-super-120b-a12b-free", "modalities": { "input": [ "text" @@ -221093,6 +229294,53 @@ }, "type": "chat" }, + { + "id": "claude-opus-4-8-think", + "name": "claude-opus-4-8-think", + "display_name": "claude-opus-4-8-think", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 200000, + "output": 200000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "type": "chat" + }, { "id": "nemotron-3-nano-omni-30b-a3b-reasoning-free", "name": "nemotron-3-nano-omni-30b-a3b-reasoning-free", @@ -221167,6 +229415,26 @@ }, "type": "chat" }, + { + "id": "gpt-image-2", + "name": "gpt-image-2", + "display_name": "gpt-image-2", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "imageGeneration" + }, { "id": "nemotron-3.5-content-safety-free", "name": "nemotron-3.5-content-safety-free", @@ -221193,15 +229461,40 @@ "type": "chat" }, { - "id": "gpt-image-2", - "name": "gpt-image-2", - "display_name": "gpt-image-2", + "id": "grok-4.3", + "name": "grok-4.3", + "display_name": "grok-4.3", "modalities": { "input": [ "text", "image" ] }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "happyhorse-1.0-i2v", + "name": "happyhorse-1.0-i2v", + "display_name": "happyhorse-1.0-i2v", + "modalities": { + "input": [ + "text" + ] + }, "limit": { "context": 8192, "output": 8192 @@ -221210,22 +229503,103 @@ "reasoning": { "supported": false }, - "type": "imageGeneration" + "type": "chat" }, { - "id": "ernie-5.1", - "name": "ernie-5.1", - "display_name": "ernie-5.1", + "id": "happyhorse-1.0-r2v", + "name": "happyhorse-1.0-r2v", + "display_name": "happyhorse-1.0-r2v", "modalities": { "input": [ "text" ] }, "limit": { - "context": 119000, - "output": 119000 + "context": 8192, + "output": 8192 }, "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "happyhorse-1.0-t2v", + "name": "happyhorse-1.0-t2v", + "display_name": "happyhorse-1.0-t2v", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "happyhorse-1.0-video-edit", + "name": "happyhorse-1.0-video-edit", + "display_name": "happyhorse-1.0-video-edit", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "north-mini-code-free", + "name": "north-mini-code-free", + "display_name": "north-mini-code-free", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "coding-glm-5.2", + "name": "coding-glm-5.2", + "display_name": "coding-glm-5.2", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -221238,22 +229612,19 @@ "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "gemini-3.1-flash-lite", - "display_name": "gemini-3.1-flash-lite", + "id": "ernie-5.1", + "name": "ernie-5.1", + "display_name": "ernie-5.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 119000, + "output": 119000 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -221266,9 +229637,9 @@ "type": "chat" }, { - "id": "gemini-3.1-flash-lite-nothink", - "name": "gemini-3.1-flash-lite-nothink", - "display_name": "gemini-3.1-flash-lite-nothink", + "id": "gemini-3.1-flash-lite", + "name": "gemini-3.1-flash-lite", + "display_name": "gemini-3.1-flash-lite", "modalities": { "input": [ "text", @@ -221294,13 +229665,15 @@ "type": "chat" }, { - "id": "grok-4.3", - "name": "grok-4.3", - "display_name": "grok-4.3", + "id": "gemini-3.1-flash-lite-nothink", + "name": "gemini-3.1-flash-lite-nothink", + "display_name": "gemini-3.1-flash-lite-nothink", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ] }, "limit": { @@ -221319,131 +229692,6 @@ }, "type": "chat" }, - { - "id": "happyhorse-1.0-i2v", - "name": "happyhorse-1.0-i2v", - "display_name": "happyhorse-1.0-i2v", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "happyhorse-1.0-r2v", - "name": "happyhorse-1.0-r2v", - "display_name": "happyhorse-1.0-r2v", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "happyhorse-1.0-t2v", - "name": "happyhorse-1.0-t2v", - "display_name": "happyhorse-1.0-t2v", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "happyhorse-1.0-video-edit", - "name": "happyhorse-1.0-video-edit", - "display_name": "happyhorse-1.0-video-edit", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "north-mini-code-free", - "name": "north-mini-code-free", - "display_name": "north-mini-code-free", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "coding-glm-5.2", - "name": "coding-glm-5.2", - "display_name": "coding-glm-5.2", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, { "id": "gpt-5.5", "name": "gpt-5.5", @@ -221672,18 +229920,19 @@ "type": "chat" }, { - "id": "command-a-plus-05-2026", - "name": "command-a-plus-05-2026", - "display_name": "command-a-plus-05-2026", + "id": "kimi-k2.6", + "name": "kimi-k2.6", + "display_name": "kimi-k2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 262144 }, "tool_call": true, "reasoning": { @@ -221697,6 +229946,30 @@ }, "type": "chat" }, + { + "id": "laguna-s-2.1-free", + "name": "laguna-s-2.1-free", + "display_name": "laguna-s-2.1-free", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "qwen3.6-max-preview", "name": "qwen3.6-max-preview", @@ -221770,19 +230043,18 @@ "type": "chat" }, { - "id": "kimi-k2.6", - "name": "kimi-k2.6", - "display_name": "kimi-k2.6", + "id": "command-a-plus-05-2026", + "name": "command-a-plus-05-2026", + "display_name": "command-a-plus-05-2026", "modalities": { "input": [ "text", - "image", - "video" + "image" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 128000 }, "tool_call": true, "reasoning": { @@ -221796,54 +230068,6 @@ }, "type": "chat" }, - { - "id": "laguna-s-2.1-free", - "name": "laguna-s-2.1-free", - "display_name": "laguna-s-2.1-free", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "nemotron-3-nano-30b-a3b-free", - "name": "nemotron-3-nano-30b-a3b-free", - "display_name": "nemotron-3-nano-30b-a3b-free", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, { "id": "claude-opus-4-7", "name": "claude-opus-4-7", @@ -221938,6 +230162,30 @@ }, "type": "chat" }, + { + "id": "nemotron-3-nano-30b-a3b-free", + "name": "nemotron-3-nano-30b-a3b-free", + "display_name": "nemotron-3-nano-30b-a3b-free", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "gpt-chat-latest", "name": "gpt-chat-latest", @@ -222063,46 +230311,6 @@ }, "type": "chat" }, - { - "id": "cohere-rerank-v4.0-fast", - "name": "cohere-rerank-v4.0-fast", - "display_name": "cohere-rerank-v4.0-fast", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "rerank" - }, - { - "id": "cohere-rerank-v4.0-pro", - "name": "cohere-rerank-v4.0-pro", - "display_name": "cohere-rerank-v4.0-pro", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "rerank" - }, { "id": "grok-4-20-non-reasoning", "name": "grok-4-20-non-reasoning", @@ -222195,6 +230403,46 @@ }, "type": "imageGeneration" }, + { + "id": "cohere-rerank-v4.0-fast", + "name": "cohere-rerank-v4.0-fast", + "display_name": "cohere-rerank-v4.0-fast", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "rerank" + }, + { + "id": "cohere-rerank-v4.0-pro", + "name": "cohere-rerank-v4.0-pro", + "display_name": "cohere-rerank-v4.0-pro", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "rerank" + }, { "id": "gemma-4-26b-a4b-it-free", "name": "gemma-4-26b-a4b-it-free", @@ -222324,31 +230572,6 @@ }, "type": "imageGeneration" }, - { - "id": "coding-minimax-m3-free", - "name": "coding-minimax-m3-free", - "display_name": "coding-minimax-m3-free", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 204800 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, { "id": "qwen3.6-plus", "name": "qwen3.6-plus", @@ -222462,44 +230685,29 @@ "type": "chat" }, { - "id": "wan2.7-image", - "name": "wan2.7-image", - "display_name": "wan2.7-image", + "id": "coding-minimax-m3-free", + "name": "coding-minimax-m3-free", + "display_name": "coding-minimax-m3-free", "modalities": { "input": [ - "text", - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 204800, + "output": 204800 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "type": "imageGeneration" - }, - { - "id": "wan2.7-image-pro", - "name": "wan2.7-image-pro", - "display_name": "wan2.7-image-pro", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, - "type": "imageGeneration" + "type": "chat" }, { "id": "cc-k2.6-code-preview", @@ -222596,6 +230804,178 @@ }, "type": "chat" }, + { + "id": "wan2.7-image", + "name": "wan2.7-image", + "display_name": "wan2.7-image", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "imageGeneration" + }, + { + "id": "wan2.7-image-pro", + "name": "wan2.7-image-pro", + "display_name": "wan2.7-image-pro", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "imageGeneration" + }, + { + "id": "qwen3.5-plus", + "name": "qwen3.5-plus", + "display_name": "qwen3.5-plus", + "modalities": { + "input": [ + "text", + "image", + "video" + ] + }, + "limit": { + "context": 991000, + "output": 991000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "type": "chat" + }, + { + "id": "claude-sonnet-4-6", + "name": "claude-sonnet-4-6", + "display_name": "claude-sonnet-4-6", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "type": "chat" + }, + { + "id": "coding-xiaomi-mimo-v2.5", + "name": "coding-xiaomi-mimo-v2.5", + "display_name": "coding-xiaomi-mimo-v2.5", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "coding-xiaomi-mimo-v2.5-pro", + "name": "coding-xiaomi-mimo-v2.5-pro", + "display_name": "coding-xiaomi-mimo-v2.5-pro", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "doubao-seed-2-0-lite-260428", "name": "doubao-seed-2-0-lite-260428", @@ -222938,9 +231318,9 @@ "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "claude-sonnet-4-6", - "display_name": "claude-sonnet-4-6", + "id": "gpt-5.3-chat-latest", + "name": "gpt-5.3-chat-latest", + "display_name": "gpt-5.3-chat-latest", "modalities": { "input": [ "text", @@ -222948,56 +231328,28 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 128000, + "output": 128000 }, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "type": "chat" }, { - "id": "coding-xiaomi-mimo-v2.5", - "name": "coding-xiaomi-mimo-v2.5", - "display_name": "coding-xiaomi-mimo-v2.5", + "id": "gpt-5.3-codex", + "name": "gpt-5.3-codex", + "display_name": "gpt-5.3-codex", "modalities": { "input": [ - "text" + "text", + "image" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 400000 }, "tool_call": true, "reasoning": { @@ -223006,68 +231358,46 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "type": "chat" }, { - "id": "coding-xiaomi-mimo-v2.5-pro", - "name": "coding-xiaomi-mimo-v2.5-pro", - "display_name": "coding-xiaomi-mimo-v2.5-pro", + "id": "gpt-image-2-free", + "name": "gpt-image-2-free", + "display_name": "gpt-image-2-free", "modalities": { "input": [ - "text" + "text", + "image" ] }, "limit": { "context": 8192, "output": 8192 }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "qwen3.5-plus", - "name": "qwen3.5-plus", - "display_name": "qwen3.5-plus", - "modalities": { - "input": [ - "text", - "image", - "video" - ] - }, - "limit": { - "context": 991000, - "output": 991000 - }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "type": "chat" + "type": "imageGeneration" }, { "id": "qwen3.5-122b-a10b", @@ -223334,38 +231664,17 @@ "type": "chat" }, { - "id": "gpt-5.3-chat-latest", - "name": "gpt-5.3-chat-latest", - "display_name": "gpt-5.3-chat-latest", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "gpt-5.3-codex", - "name": "gpt-5.3-codex", - "display_name": "gpt-5.3-codex", + "id": "coding-glm-5.1", + "name": "coding-glm-5.1", + "display_name": "coding-glm-5.1", "modalities": { "input": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, - "output": 400000 + "context": 8192, + "output": 8192 }, "tool_call": true, "reasoning": { @@ -223374,47 +231683,11 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "type": "chat" }, - { - "id": "gpt-image-2-free", - "name": "gpt-image-2-free", - "display_name": "gpt-image-2-free", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "imageGeneration" - }, { "id": "doubao-seed-2-0-pro", "name": "doubao-seed-2-0-pro", @@ -223570,27 +231843,21 @@ "type": "chat" }, { - "id": "coding-glm-5.1", - "name": "coding-glm-5.1", - "display_name": "coding-glm-5.1", + "id": "qwen3-coder-next", + "name": "qwen3-coder-next", + "display_name": "qwen3-coder-next", "modalities": { "input": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 2000000, + "output": 2000000 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "type": "chat" }, @@ -223683,36 +231950,17 @@ "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "qwen3-coder-next", - "display_name": "qwen3-coder-next", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 2000000, - "output": 2000000 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "minimax-m2.7", - "name": "minimax-m2.7", - "display_name": "minimax-m2.7", + "id": "glm-5", + "name": "glm-5", + "display_name": "glm-5", "modalities": { "input": [ "text" ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 202752, + "output": 202752 }, "tool_call": true, "reasoning": { @@ -223732,6 +231980,27 @@ }, "type": "chat" }, + { + "id": "glm-5v-turbo", + "name": "glm-5v-turbo", + "display_name": "glm-5v-turbo", + "modalities": { + "input": [ + "text", + "image", + "video" + ] + }, + "limit": { + "context": 200000, + "output": 200000 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "claude-opus-4-6", "name": "claude-opus-4-6", @@ -223832,17 +232101,17 @@ "type": "chat" }, { - "id": "glm-5", - "name": "glm-5", - "display_name": "glm-5", + "id": "minimax-m2.7", + "name": "minimax-m2.7", + "display_name": "minimax-m2.7", "modalities": { "input": [ "text" ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 200000, + "output": 200000 }, "tool_call": true, "reasoning": { @@ -223862,27 +232131,6 @@ }, "type": "chat" }, - { - "id": "glm-5v-turbo", - "name": "glm-5v-turbo", - "display_name": "glm-5v-turbo", - "modalities": { - "input": [ - "text", - "image", - "video" - ] - }, - "limit": { - "context": 200000, - "output": 200000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "doubao-seed-2-0-code-preview", "name": "doubao-seed-2-0-code-preview", @@ -224316,6 +232564,50 @@ }, "type": "chat" }, + { + "id": "mimo-v2-omni", + "name": "mimo-v2-omni", + "display_name": "mimo-v2-omni", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "mimo-v2-pro", + "name": "mimo-v2-pro", + "display_name": "mimo-v2-pro", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "embed-v-4-0", "name": "embed-v-4-0", @@ -224375,50 +232667,6 @@ }, "type": "imageGeneration" }, - { - "id": "mimo-v2-omni", - "name": "mimo-v2-omni", - "display_name": "mimo-v2-omni", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "mimo-v2-pro", - "name": "mimo-v2-pro", - "display_name": "mimo-v2-pro", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ] - }, - "limit": { - "context": 1000000, - "output": 1000000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "cohere-command-a", "name": "cohere-command-a", @@ -225708,59 +233956,60 @@ "type": "imageGeneration" }, { - "id": "cc-glm-5", - "name": "cc-glm-5", - "display_name": "cc-glm-5", + "id": "gemini-2.5-flash-image", + "name": "gemini-2.5-flash-image", + "display_name": "gemini-2.5-flash-image", "modalities": { "input": [ + "image", "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32800, + "output": 32800 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "type": "chat" + "type": "imageGeneration" }, { - "id": "cc-glm-5-turbo", - "name": "cc-glm-5-turbo", - "display_name": "cc-glm-5-turbo", + "id": "qwen3.6-plus-preview-free", + "name": "qwen3.6-plus-preview-free", + "display_name": "qwen3.6-plus-preview-free", "modalities": { "input": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 1000000 }, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "type": "chat" }, { - "id": "cloudflare-glm-5.2", - "name": "cloudflare-glm-5.2", - "display_name": "cloudflare-glm-5.2", + "id": "zai-glm-5-turbo", + "name": "zai-glm-5-turbo", + "display_name": "zai-glm-5-turbo", "limit": { "context": 8192, "output": 8192 @@ -225772,60 +234021,59 @@ "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "gemini-2.5-flash-image", - "display_name": "gemini-2.5-flash-image", + "id": "cc-glm-5", + "name": "cc-glm-5", + "display_name": "cc-glm-5", "modalities": { "input": [ - "image", "text" ] }, "limit": { - "context": 32800, - "output": 32800 + "context": 8192, + "output": 8192 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "imageGeneration" + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" }, { - "id": "qwen3.6-plus-preview-free", - "name": "qwen3.6-plus-preview-free", - "display_name": "qwen3.6-plus-preview-free", + "id": "cc-glm-5-turbo", + "name": "cc-glm-5-turbo", + "display_name": "cc-glm-5-turbo", "modalities": { "input": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 8192, + "output": 8192 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "type": "chat" }, { - "id": "zai-glm-5-turbo", - "name": "zai-glm-5-turbo", - "display_name": "zai-glm-5-turbo", + "id": "cloudflare-glm-5.2", + "name": "cloudflare-glm-5.2", + "display_name": "cloudflare-glm-5.2", "limit": { "context": 8192, "output": 8192 @@ -227026,12 +235274,13 @@ "type": "chat" }, { - "id": "wan2.5-t2v-preview", - "name": "wan2.5-t2v-preview", - "display_name": "wan2.5-t2v-preview", + "id": "wan2.5-i2v-preview", + "name": "wan2.5-i2v-preview", + "display_name": "wan2.5-i2v-preview", "modalities": { "input": [ - "text" + "text", + "image" ] }, "limit": { @@ -227065,13 +235314,12 @@ "type": "chat" }, { - "id": "wan2.5-i2v-preview", - "name": "wan2.5-i2v-preview", - "display_name": "wan2.5-i2v-preview", + "id": "wan2.5-t2v-preview", + "name": "wan2.5-t2v-preview", + "display_name": "wan2.5-t2v-preview", "modalities": { "input": [ - "text", - "image" + "text" ] }, "limit": { @@ -235115,9 +243363,9 @@ "type": "chat" }, { - "id": "text-curie-001", - "name": "text-curie-001", - "display_name": "text-curie-001", + "id": "text-babbage-001", + "name": "text-babbage-001", + "display_name": "text-babbage-001", "limit": { "context": 8192, "output": 8192 @@ -235129,14 +243377,9 @@ "type": "chat" }, { - "id": "tts-1-hd-1106", - "name": "tts-1-hd-1106", - "display_name": "tts-1-hd-1106", - "modalities": { - "input": [ - "audio" - ] - }, + "id": "text-davinci-002", + "name": "text-davinci-002", + "display_name": "text-davinci-002", "limit": { "context": 8192, "output": 8192 @@ -235145,12 +243388,17 @@ "reasoning": { "supported": false }, - "type": "tts" + "type": "chat" }, { - "id": "text-davinci-003", - "name": "text-davinci-003", - "display_name": "text-davinci-003", + "id": "tts-1-hd-1106", + "name": "tts-1-hd-1106", + "display_name": "tts-1-hd-1106", + "modalities": { + "input": [ + "audio" + ] + }, "limit": { "context": 8192, "output": 8192 @@ -235159,7 +243407,7 @@ "reasoning": { "supported": false }, - "type": "chat" + "type": "tts" }, { "id": "tts-1-hd", @@ -235218,20 +243466,6 @@ }, "type": "tts" }, - { - "id": "text-babbage-001", - "name": "text-babbage-001", - "display_name": "text-babbage-001", - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "text-ada-001", "name": "text-ada-001", @@ -235261,9 +243495,9 @@ "type": "chat" }, { - "id": "text-davinci-002", - "name": "text-davinci-002", - "display_name": "text-davinci-002", + "id": "text-moderation-stable", + "name": "text-moderation-stable", + "display_name": "text-moderation-stable", "limit": { "context": 8192, "output": 8192 @@ -235275,9 +243509,9 @@ "type": "chat" }, { - "id": "text-moderation-latest", - "name": "text-moderation-latest", - "display_name": "text-moderation-latest", + "id": "text-curie-001", + "name": "text-curie-001", + "display_name": "text-curie-001", "limit": { "context": 8192, "output": 8192 @@ -235303,12 +243537,12 @@ "type": "chat" }, { - "id": "whisper-1", - "name": "whisper-1", - "display_name": "whisper-1", + "id": "text-embedding-v1", + "name": "text-embedding-v1", + "display_name": "text-embedding-v1", "modalities": { "input": [ - "audio" + "text" ] }, "limit": { @@ -235319,12 +243553,12 @@ "reasoning": { "supported": false }, - "type": "chat" + "type": "embedding" }, { - "id": "whisper-large-v3", - "name": "whisper-large-v3", - "display_name": "whisper-large-v3", + "id": "whisper-1", + "name": "whisper-1", + "display_name": "whisper-1", "modalities": { "input": [ "audio" @@ -235341,9 +243575,9 @@ "type": "chat" }, { - "id": "whisper-large-v3-turbo", - "name": "whisper-large-v3-turbo", - "display_name": "whisper-large-v3-turbo", + "id": "whisper-large-v3", + "name": "whisper-large-v3", + "display_name": "whisper-large-v3", "modalities": { "input": [ "audio" @@ -235360,12 +243594,12 @@ "type": "chat" }, { - "id": "text-embedding-v1", - "name": "text-embedding-v1", - "display_name": "text-embedding-v1", + "id": "whisper-large-v3-turbo", + "name": "whisper-large-v3-turbo", + "display_name": "whisper-large-v3-turbo", "modalities": { "input": [ - "text" + "audio" ] }, "limit": { @@ -235376,7 +243610,7 @@ "reasoning": { "supported": false }, - "type": "embedding" + "type": "chat" }, { "id": "step-2-16k", @@ -235463,6 +243697,20 @@ }, "type": "chat" }, + { + "id": "text-davinci-003", + "name": "text-davinci-003", + "display_name": "text-davinci-003", + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "yi-large", "name": "yi-large", @@ -235548,9 +243796,9 @@ "type": "chat" }, { - "id": "text-moderation-stable", - "name": "text-moderation-stable", - "display_name": "text-moderation-stable", + "id": "text-moderation-latest", + "name": "text-moderation-latest", + "display_name": "text-moderation-latest", "limit": { "context": 8192, "output": 8192 @@ -238946,8 +247194,8 @@ }, { "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek: DeepSeek V4 Flash", - "display_name": "DeepSeek: DeepSeek V4 Flash", + "name": "DeepSeek: DeepSeek V4 Flash 0423", + "display_name": "DeepSeek: DeepSeek V4 Flash 0423", "modalities": { "input": [ "text" @@ -238958,7 +247206,7 @@ }, "limit": { "context": 1048576, - "output": 393216 + "output": 131072 }, "tool_call": true, "reasoning": { @@ -240200,6 +248448,34 @@ }, "type": "chat" }, + { + "id": "inclusionai/ling-3.0-flash", + "name": "Ling-3.0-flash", + "display_name": "Ling-3.0-flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "inclusionai/ling-3.0-flash:free", "name": "Ling-3.0-flash (free)", @@ -240464,7 +248740,7 @@ }, "limit": { "context": 131072, - "output": 128000 + "output": 16384 }, "tool_call": true, "reasoning": { @@ -240573,6 +248849,33 @@ "attachment": true, "type": "imageGeneration" }, + { + "id": "meta/muse-spark-1.2", + "name": "Meta: Muse Spark 1.2", + "display_name": "Meta: Muse Spark 1.2", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "type": "imageGeneration" + }, { "id": "microsoft/phi-4", "name": "Microsoft: Phi 4", @@ -240786,7 +249089,7 @@ ] }, "limit": { - "context": 196608, + "context": 204800, "output": 131072 }, "temperature": true, @@ -241215,7 +249518,7 @@ ] }, "limit": { - "context": 128000, + "context": 256000, "output": 16384 }, "temperature": true, @@ -244556,8 +252859,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 32000, + "output": 32000 }, "tool_call": false, "reasoning": { @@ -244883,8 +253186,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 160000, + "output": 32768 }, "tool_call": true, "reasoning": { @@ -245041,7 +253344,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 16384 }, "tool_call": true, "reasoning": { @@ -245062,8 +253365,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 128000 }, "tool_call": true, "reasoning": { @@ -245157,8 +253460,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -245594,8 +253897,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 131072 }, "tool_call": true, "reasoning": { @@ -245845,6 +254148,36 @@ }, "type": "imageGeneration" }, + { + "id": "qwen/qwen3.8-max", + "name": "Qwen: Qwen3.8 Max", + "display_name": "Qwen: Qwen3.8 Max", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "imageGeneration" + }, { "id": "rekaai/reka-edge", "name": "Reka Edge", @@ -246234,8 +254567,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1024000, + "output": 1024000 }, "tool_call": true, "reasoning": { @@ -246328,8 +254661,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 131072 }, "tool_call": true, "reasoning": { @@ -246362,8 +254695,8 @@ }, { "id": "x-ai/grok-4.20", - "name": "xAI: Grok 4.20", - "display_name": "xAI: Grok 4.20", + "name": "SpaceXAI: Grok 4.20", + "display_name": "SpaceXAI: Grok 4.20", "modalities": { "input": [ "text", @@ -246387,8 +254720,8 @@ }, { "id": "x-ai/grok-4.20-multi-agent", - "name": "xAI: Grok 4.20 Multi-Agent", - "display_name": "xAI: Grok 4.20 Multi-Agent", + "name": "SpaceXAI: Grok 4.20 Multi-Agent", + "display_name": "SpaceXAI: Grok 4.20 Multi-Agent", "modalities": { "input": [ "text", @@ -246412,8 +254745,8 @@ }, { "id": "x-ai/grok-4.3", - "name": "xAI: Grok 4.3", - "display_name": "xAI: Grok 4.3", + "name": "SpaceXAI: Grok 4.3", + "display_name": "SpaceXAI: Grok 4.3", "modalities": { "input": [ "text", @@ -246442,8 +254775,8 @@ }, { "id": "x-ai/grok-4.5", - "name": "xAI: Grok 4.5", - "display_name": "xAI: Grok 4.5", + "name": "SpaceXAI: Grok 4.5", + "display_name": "SpaceXAI: Grok 4.5", "modalities": { "input": [ "text", @@ -246472,8 +254805,8 @@ }, { "id": "x-ai/grok-build-0.1", - "name": "xAI: Grok Build 0.1", - "display_name": "xAI: Grok Build 0.1", + "name": "SpaceXAI: Grok Build 0.1", + "display_name": "SpaceXAI: Grok Build 0.1", "modalities": { "input": [ "text", @@ -246820,8 +255153,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -246849,8 +255182,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -251510,6 +259843,36 @@ }, "type": "chat" }, + { + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131702 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, { "id": "gemini-omni-flash", "name": "gemini-omni-flash", @@ -252439,7 +260802,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -253071,7 +261435,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -253141,9 +261506,7 @@ "display_name": "Baidu: ERNIE 5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -253162,7 +261525,7 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, "release_date": "2026-05-10", "last_updated": "2026-05-10", @@ -253357,9 +261720,7 @@ "display_name": "ByteDance: Doubao-Seed-2.1-pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -253367,13 +261728,16 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 128000 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, + "attachment": false, + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { @@ -253382,9 +261746,7 @@ "display_name": "ByteDance: Doubao-Seed-2.1-turbo", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -253392,13 +261754,16 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 128000 }, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, + "attachment": false, + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { @@ -253408,8 +261773,7 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -253417,13 +261781,17 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 32768 }, "tool_call": false, "reasoning": { "supported": true, "default": true }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-18", + "last_updated": "2026-07-18", "type": "chat" }, { @@ -253565,7 +261933,7 @@ } }, "attachment": true, - "open_weights": false, + "open_weights": true, "release_date": "2025-12-01", "last_updated": "2025-12-01", "type": "chat" @@ -253937,7 +262305,8 @@ "text", "image", "video", - "audio" + "audio", + "pdf" ], "output": [ "text" @@ -253947,7 +262316,7 @@ "context": 1048576, "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253960,8 +262329,9 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { @@ -253971,16 +262341,20 @@ "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048756, + "context": 1048576, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254005,6 +262379,7 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-01", "release_date": "2026-02-19", "last_updated": "2026-02-19", "type": "chat" @@ -254017,7 +262392,9 @@ "input": [ "text", "image", - "audio" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -254027,7 +262404,7 @@ "context": 1048576, "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254067,6 +262444,8 @@ "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -254074,8 +262453,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -254103,6 +262482,8 @@ "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -254110,8 +262491,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -254173,6 +262554,40 @@ "last_updated": "2026-04-22", "type": "embedding" }, + { + "id": "google/gemma-4-26b-a4b-it", + "name": "Google: Gemma 4 26B A4B IT", + "display_name": "Google: Gemma 4 26B A4B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 131072 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, { "id": "inclusionai/ling-2.6-1t", "name": "inclusionAI: Ling-2.6-1T", @@ -254220,7 +262635,7 @@ "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2026-04-21", "last_updated": "2026-04-21", "type": "chat" @@ -254241,11 +262656,9 @@ "context": 262144, "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -254313,8 +262726,7 @@ "display_name": "KwaiKAT: KAT-Coder-Air-V2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -254324,16 +262736,14 @@ "context": 256000, "output": 80000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-07-10", + "release_date": "2026-07-14", + "last_updated": "2026-07-14", "type": "chat" }, { @@ -254369,8 +262779,7 @@ "display_name": "KwaiKAT: KAT-Coder-Pro-V2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -254380,16 +262789,14 @@ "context": 256000, "output": 80000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-07-10", + "release_date": "2026-07-14", + "last_updated": "2026-07-14", "type": "chat" }, { @@ -254405,8 +262812,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048756, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -254416,19 +262823,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": false, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-07-20", + "last_updated": "2026-07-20", "type": "chat" }, { @@ -254478,14 +262879,13 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-31", - "last_updated": "2025-01-31", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { @@ -254502,11 +262902,11 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -254578,7 +262978,7 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-01-24", + "release_date": "2025-01-12", "last_updated": "2026-01-24", "type": "chat" }, @@ -254598,6 +262998,7 @@ "context": 200000, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254609,9 +263010,9 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-19", - "last_updated": "2025-12-19", + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { @@ -254630,6 +263031,7 @@ "context": 204800, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254641,7 +263043,7 @@ } }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2026-02-12", "last_updated": "2026-02-12", "type": "chat" @@ -254831,8 +263233,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -254853,9 +263255,9 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-02", - "last_updated": "2026-02-02", + "knowledge": "2025-12", + "release_date": "2026-01-30", + "last_updated": "2026-02-12", "type": "chat" }, { @@ -254934,7 +263336,8 @@ "display_name": "MoonshotAI: Kimi K2.7 Code HighSpeed", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -254942,7 +263345,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": false, "tool_call": true, @@ -254952,13 +263355,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, @@ -254975,7 +263372,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -254983,9 +263381,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -255110,15 +263508,16 @@ "context": 1047576, "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { @@ -255128,7 +263527,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -255136,17 +263536,18 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, + "knowledge": "2023-09", "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { @@ -255156,7 +263557,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -255301,10 +263703,11 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { @@ -255404,8 +263807,9 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { @@ -255423,7 +263827,7 @@ }, "limit": { "context": 400000, - "output": 128000 + "output": 272000 }, "temperature": false, "tool_call": true, @@ -255448,6 +263852,7 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2024-09-30", "release_date": "2025-10-06", "last_updated": "2025-10-06", "type": "chat" @@ -255579,8 +263984,9 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { @@ -255589,7 +263995,8 @@ "display_name": "OpenAI: GPT-5.1-Codex-Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -255628,8 +264035,9 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { @@ -255690,8 +264098,9 @@ "display_name": "OpenAI: GPT-5.2 Chat", "modalities": { "input": [ - "text", - "image" + "pdf", + "image", + "text" ], "output": [ "text" @@ -255704,14 +264113,12 @@ "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2025-12-10", + "last_updated": "2025-12-10", "type": "chat" }, { @@ -255770,7 +264177,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -255809,8 +264217,9 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { @@ -255848,7 +264257,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -255887,8 +264297,9 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-02-10", - "last_updated": "2026-02-10", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { @@ -256058,7 +264469,7 @@ "image" ], "output": [ - "image" + "text" ] }, "limit": { @@ -256093,9 +264504,10 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-08-31", "release_date": "2026-03-05", "last_updated": "2026-03-05", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.5", @@ -256104,7 +264516,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -256155,7 +264568,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -256190,7 +264604,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -256243,7 +264658,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -256296,7 +264712,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -256532,14 +264949,12 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 256000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -256554,9 +264969,8 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "release_date": "2025-09-11", + "last_updated": "2025-09-11", "type": "chat" }, { @@ -256647,7 +265061,7 @@ } }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2024-01-01", "last_updated": "2024-01-01", "type": "chat" @@ -256673,7 +265087,7 @@ "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "release_date": "2026-03-17", "last_updated": "2026-03-17", "type": "chat" @@ -256694,14 +265108,16 @@ "context": 128000, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-09-17", - "last_updated": "2025-09-17", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { @@ -256720,6 +265136,7 @@ "context": 256000, "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true @@ -256737,8 +265154,9 @@ }, "attachment": false, "open_weights": false, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { @@ -256835,6 +265253,7 @@ "context": 983616, "output": 65536 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": true @@ -256852,6 +265271,7 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-04", "release_date": "2026-02-16", "last_updated": "2026-02-16", "type": "chat" @@ -256932,8 +265352,9 @@ }, "attachment": false, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-05-01", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { @@ -256985,7 +265406,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -256993,7 +265415,7 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -257008,8 +265430,8 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-07-27", - "last_updated": "2026-07-27", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { @@ -257081,6 +265503,41 @@ "last_updated": "2026-06-02", "type": "chat" }, + { + "id": "qwen/qwen3.8-max", + "name": "Qwen: Qwen3.8-Max", + "display_name": "Qwen: Qwen3.8-Max", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" + }, { "id": "sapiens-ai/agnes-2.0-flash", "name": "Sapiens AI: Agnes-2.0-Flash", @@ -257400,15 +265857,17 @@ "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -257526,6 +265985,7 @@ "context": 200000, "output": 65535 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -257537,7 +265997,8 @@ } }, "attachment": false, - "open_weights": false, + "open_weights": true, + "knowledge": "2025-04", "release_date": "2025-09-30", "last_updated": "2025-09-30", "type": "chat" @@ -257689,7 +266150,7 @@ }, "limit": { "context": 202752, - "output": 40551 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -257704,6 +266165,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-04", "release_date": "2026-01-19", "last_updated": "2026-01-19", "type": "chat" @@ -257901,8 +266363,9 @@ }, "limit": { "context": 202800, - "output": 131100 + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false diff --git a/resources/skills/deepchat-cli/SKILL.md b/resources/skills/deepchat-cli/SKILL.md new file mode 100644 index 0000000000..75135ddc1e --- /dev/null +++ b/resources/skills/deepchat-cli/SKILL.md @@ -0,0 +1,111 @@ +--- +name: deepchat-cli +description: Use DeepChat's bundled CLI control plane for model inference, image/video/speech generation, transcription, OCR, artifact inspection, public configuration, Skills, and MCP operations. Activate when a user asks to invoke DeepChat capabilities that are not already exposed as a more specific tool, compare models, run a benchmark, inspect DeepChat runtime state, or manage DeepChat through the CLI. +allowedTools: + - exec + - process +--- + +# DeepChat CLI + +Use the bundled `deepchat` command to ask the running DeepChat main process to perform supported +operations. The main process remains the sole owner of providers, credentials, Skills, MCP servers, +artifacts, Agent runs, and approvals. + +## Command rules + +- Every command must begin exactly with `deepchat `. Put `--json`, `--jsonl`, + `--timeout`, and all domain options after the domain and verb. +- Execute one standalone command per `exec` call. Do not use pipes, redirection, command separators, + command substitution, environment assignments, or shell wrappers around `deepchat`. +- Quote every user-controlled argument for the current shell. Never interpolate untrusted text into + an unquoted command. +- Prefer `--json` for one result and `--jsonl` for streaming or benchmark collection. Use text mode + only when its output will be returned directly to the user. +- Do not inspect authentication environment variables or DeepChat's local descriptor. Authorization + is injected only after the command has passed the normal shell permission check. +- A shell approval authorizes command execution. Sensitive mutations can additionally pause for a + renderer approval; wait for that decision and never attempt to manufacture confirmation data. +- Use `deepchat help` or `deepchat --help` only when the options below are + insufficient. Do not probe undocumented routes. + +## Agent file and recursion boundaries + +- Agent callers may consume a DeepChat-owned artifact with `--artifact ` and inspect metadata + with `artifact describe`. +- Do not use `--file`, `--out`, `--overwrite`, `artifact get`, or `artifact delete`. Agent callers + cannot upload arbitrary local bytes, download artifact bytes, or choose output paths. +- Do not call `agent run` or `run watch`. An Agent cannot recursively create a detached Agent run, + and waiting on its own currently executing run would deadlock it. Use `run get` for a nonblocking + snapshot or `run cancel` to request cancellation. +- Generated media remains in DeepChat's artifact spool. Return the artifact metadata or ID so the + application can render or reuse it. + +## Discovery and model calls + +```text +deepchat system status --json +deepchat system capabilities --json +deepchat system doctor --json +deepchat provider list --enabled-only --json +deepchat model list --provider --json +deepchat model config-get --provider --model --json +deepchat model invoke --provider --model --prompt --jsonl +``` + +Always discover provider and model IDs rather than guessing them. `model invoke` is a raw provider +call: it does not create a chat session, run tools, or start an Agent loop. + +## Media, transcription, and OCR + +```text +deepchat image generate --provider --model --prompt --jsonl +deepchat video generate --provider --model --prompt --jsonl +deepchat audio speak --provider --model --text --jsonl +deepchat audio transcribe --provider --model --artifact --json +deepchat ocr status --json +deepchat ocr extract --artifact --json +deepchat artifact describe --id --json +``` + +Use the provider/model lists to choose a compatible runtime. OCR is local and does not require a +provider. OCR text is returned inline and is not written to the artifact spool. + +## Public configuration and management + +Read-only operations: + +```text +deepchat settings get --json +deepchat skill list --json +deepchat mcp list --json +``` + +Agent callers may request renderer approval for preference-only settings, query-free HTTPS Skill +installation, and adding a new disabled HTTPS remote MCP configuration. Only perform one when it +directly satisfies the user's request: + +```text +deepchat settings set --key --value --json +deepchat skill install --url --json +deepchat mcp add --name --stdin --json +``` + +The Agent setting allowlist is limited to presentation preferences such as font size/family, +artifact effects, auto-scroll, notifications, and copy-with-reasoning. Agent Skill URLs cannot carry +credentials, query parameters, or fragments. The main process classifies MCP input before approval +and rejects stdio commands, non-HTTPS endpoints, headers, authorization bindings, or configurations +too large to review safely. Provider/model configuration, credential writes, local Skill archives, +Skill enable/disable/removal, MCP update/runtime control/removal, and every destructive operation +require the DeepChat UI or a human terminal. + +## Benchmark discipline + +- Pin provider/model IDs and pass per-invocation options; do not mutate global defaults to prepare a + benchmark. +- Record structured output, exit status, wall time, and errors. Preserve failed samples. +- For OCR, distinguish cache hit, cache miss with warm runtime, cold runtime after app restart, and + offline availability. `ocr clear-cache` initializes the resource graph but does not start the OCR + helper, so classify the next extraction from its reported pre-extraction runtime state. +- Run samples sequentially unless the benchmark explicitly measures concurrency; Agent compute is + rate-limited and bounded by the main process. diff --git a/scripts/build-cli.mjs b/scripts/build-cli.mjs new file mode 100644 index 0000000000..a0606f45aa --- /dev/null +++ b/scripts/build-cli.mjs @@ -0,0 +1,96 @@ +#!/usr/bin/env node + +import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' +import { build } from 'vite' + +const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)) +export const repositoryRoot = path.resolve(scriptDirectory, '..') +export const cliOutputDirectory = path.join(repositoryRoot, 'out', 'cli') + +export const POSIX_LAUNCHER = `#!/bin/sh +set -eu + +case "$0" in + */*) script_dir=\${0%/*} ;; + *) script_dir=. ;; +esac +script_dir=$(CDPATH= cd -P -- "$script_dir" && pwd) +runtime_node="$script_dir/../runtime/node/bin/node" +if [ ! -x "$runtime_node" ]; then + runtime_node="$script_dir/../../runtime/node/bin/node" +fi +cli_module="$script_dir/deepchat.mjs" +if [ -x "$runtime_node" ] && [ -f "$cli_module" ]; then + exec "$runtime_node" "$cli_module" "$@" +fi +echo "DeepChat CLI bundled resources are unavailable." >&2 +exit 127 +` + +export const WINDOWS_LAUNCHER = `@echo off\r +set "runtime_node=%~dp0..\\runtime\\node\\node.exe"\r +if not exist "%runtime_node%" set "runtime_node=%~dp0..\\..\\runtime\\node\\node.exe"\r +if not exist "%runtime_node%" goto missing_runtime\r +if not exist "%~dp0deepchat.mjs" goto missing_runtime\r +"%runtime_node%" "%~dp0deepchat.mjs" %*\r +exit /b %errorlevel%\r +:missing_runtime\r +echo DeepChat CLI bundled resources are unavailable. 1>&2\r +exit /b 127\r +` + +export async function buildCli(options = {}) { + const packageJson = JSON.parse( + await readFile(path.join(repositoryRoot, 'package.json'), 'utf8') + ) + const outDir = options.outDir ? path.resolve(options.outDir) : cliOutputDirectory + + await build({ + configFile: false, + root: repositoryRoot, + publicDir: false, + resolve: { + alias: { + '@shared': path.join(repositoryRoot, 'src', 'shared') + } + }, + define: { + __DEEPCHAT_CLI_VERSION__: JSON.stringify(packageJson.version) + }, + build: { + target: 'node24', + outDir, + emptyOutDir: true, + copyPublicDir: false, + minify: 'esbuild', + lib: { + entry: path.join(repositoryRoot, 'src', 'cli', 'index.ts'), + formats: ['es'] + }, + rollupOptions: { + external: [/^node:/], + output: { + format: 'es', + entryFileNames: 'deepchat.mjs', + inlineDynamicImports: true, + banner: '#!/usr/bin/env node' + } + } + }, + logLevel: options.logLevel ?? 'info' + }) + + await mkdir(outDir, { recursive: true }) + await writeFile(path.join(outDir, 'deepchat'), POSIX_LAUNCHER, { mode: 0o755 }) + await chmod(path.join(outDir, 'deepchat'), 0o755) + await writeFile(path.join(outDir, 'deepchat.cmd'), WINDOWS_LAUNCHER, 'utf8') +} + +if (process.argv[1] && pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url) { + buildCli().catch((error) => { + console.error(error instanceof Error ? error.message : error) + process.exitCode = 1 + }) +} diff --git a/src/cli/args.ts b/src/cli/args.ts new file mode 100644 index 0000000000..b12facf259 --- /dev/null +++ b/src/cli/args.ts @@ -0,0 +1,1171 @@ +import { ArtifactIdSchema } from '@shared/contracts/routes/artifacts.routes' +import { + AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES, + audioTranscribeArtifactRoute, + audioTranscribeUploadRoute +} from '@shared/contracts/routes/audio.routes' +import { + OCR_EXTRACTION_MAX_INPUT_BYTES, + ocrExtractArtifactRoute, + ocrExtractUploadRoute +} from '@shared/contracts/routes/ocr.routes' +import { + skillsInstallPublicUrlRoute, + skillsInstallUploadRoute +} from '@shared/contracts/routes/skills.routes' +import { + RUN_MAX_MESSAGE_PAGE_SIZE, + RunEventCursorSchema, + RunIdSchema +} from '@shared/contracts/routes/runs.routes' +import { MessagePageCursorSchema } from '@shared/contracts/common' +import { + cliCommandKey, + getCliCommandDefinition, + type CliRpcContract +} from '@shared/contracts/cliCommands' +import { JsonValueSchema, type JsonValue } from '@shared/contracts/json' +import { LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS } from '@shared/contracts/localControl' +import { + ATTACHMENT_PDF_OCR_MAX_TOKENS, + PDF_PAGE_COUNT_SANITY_LIMIT +} from '@shared/types/attachment' +import { SKILL_ARCHIVE_MAX_INPUT_BYTES } from '@shared/types/skill' +import path from 'node:path' +import { CliUsageError } from './errors' + +export const CLI_OUTPUT_ENV = 'DEEPCHAT_CLI_OUTPUT' +export const CLI_TIMEOUT_ENV = 'DEEPCHAT_CLI_TIMEOUT_MS' +export const DEFAULT_CLI_TIMEOUT_MS = 30_000 +export const MAX_CLI_TIMEOUT_MS = LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS +export const DEFAULT_COMPUTE_TIMEOUT_MS = MAX_CLI_TIMEOUT_MS +export const DEFAULT_MUTATION_TIMEOUT_MS = 10 * 60_000 + +export type CliOutputMode = 'text' | 'json' | 'jsonl' +export type { CliRpcContract } from '@shared/contracts/cliCommands' + +export type CliCommandOperation = 'rpc' | 'stream' | 'upload' | 'download' + +export type ParsedCliArguments = Readonly<{ + domain: string + verb: string + contract: CliRpcContract | null + outputMode: CliOutputMode + timeoutMs: number + helpRequested: boolean + operation: CliCommandOperation + params: JsonValue + inputPath?: string + uploadMaxBytes?: number + outputPath?: string + overwrite: boolean + readStdin: boolean +}> + +function parseBoolean(value: string, source: string): boolean { + if (value === 'true') return true + if (value === 'false') return false + throw new CliUsageError(`${source} must be true or false`) +} + +function parseNumberInRange( + value: string, + source: string, + minimum: number, + maximum: number, + integer = false +): number { + const parsed = Number(value) + if ( + !Number.isFinite(parsed) || + (integer && !Number.isSafeInteger(parsed)) || + parsed < minimum || + parsed > maximum + ) { + const qualifier = integer ? 'an integer' : 'a number' + throw new CliUsageError(`${source} must be ${qualifier} between ${minimum} and ${maximum}`) + } + return parsed +} + +type DomainOptionValue = JsonValue +type DomainValueParser = (value: string) => DomainOptionValue + +const stringOption: DomainValueParser = (value) => value +const settingValueOption: DomainValueParser = (value) => { + const candidate = + value === 'true' || + value === 'false' || + value === 'null' || + /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/.test(value) || + value.startsWith('"') + ? (() => { + try { + return JSON.parse(value) as unknown + } catch { + throw new CliUsageError('--value contains invalid JSON') + } + })() + : value + const parsed = JsonValueSchema.safeParse(candidate) + if (!parsed.success) throw new CliUsageError('--value must be a JSON scalar') + if (parsed.data !== null && typeof parsed.data === 'object') { + throw new CliUsageError('--value must be a JSON scalar') + } + return parsed.data +} +const VALUE_DOMAIN_OPTIONS: Readonly> = { + id: (value) => { + const parsed = ArtifactIdSchema.safeParse(value) + if (!parsed.success) throw new CliUsageError('--id is not a valid artifact identifier') + return parsed.data + }, + out: stringOption, + file: stringOption, + artifact: (value) => { + const parsed = ArtifactIdSchema.safeParse(value) + if (!parsed.success) throw new CliUsageError('--artifact is not a valid artifact identifier') + return parsed.data + }, + run: (value) => { + const parsed = RunIdSchema.safeParse(value) + if (!parsed.success) throw new CliUsageError('--run is not a valid run identifier') + return parsed.data + }, + cursor: (value) => { + if (value.length > 4_096) throw new CliUsageError('--cursor exceeds its character limit') + return value + }, + mime: (value) => { + const normalized = value.trim().toLowerCase() + if (!normalized) throw new CliUsageError('--mime must not be empty') + return normalized + }, + provider: stringOption, + model: stringOption, + prompt: stringOption, + text: stringOption, + system: stringOption, + title: stringOption, + 'project-dir': stringOption, + skills: stringOption, + 'disable-tools': stringOption, + 'max-turns': (value) => parseNumberInRange(value, '--max-turns', 1, 100, true), + limit: (value) => parseNumberInRange(value, '--limit', 1, RUN_MAX_MESSAGE_PAGE_SIZE, true), + temperature: (value) => parseNumberInRange(value, '--temperature', 0, 2), + 'max-tokens': (value) => parseNumberInRange(value, '--max-tokens', 1, 1_000_000, true), + size: stringOption, + quality: stringOption, + format: stringOption, + compression: (value) => parseNumberInRange(value, '--compression', 0, 100, true), + background: stringOption, + moderation: stringOption, + seconds: stringOption, + ratio: stringOption, + duration: (value) => parseNumberInRange(value, '--duration', -1, 3_600, true), + resolution: stringOption, + watermark: (value) => parseBoolean(value, '--watermark'), + audio: (value) => parseBoolean(value, '--audio'), + voice: stringOption, + speed: (value) => parseNumberInRange(value, '--speed', 0.25, 4), + instructions: stringOption, + agent: stringOption, + url: stringOption, + name: stringOption, + 'api-type': stringOption, + 'base-url': stringOption, + enabled: (value) => parseBoolean(value, '--enabled'), + key: stringOption, + keys: stringOption, + value: settingValueOption, + backend: stringOption, + 'page-count': (value) => + parseNumberInRange(value, '--page-count', 1, PDF_PAGE_COUNT_SANITY_LIMIT, true) +} + +const FLAG_DOMAIN_OPTIONS = new Set(['overwrite', 'stdin', 'enabled-only']) +const COMMAND_DOMAIN_OPTIONS = new Map>([ + ['artifact describe', new Set(['id'])], + ['artifact get', new Set(['id', 'out', 'overwrite'])], + ['artifact delete', new Set(['id'])], + [ + 'model invoke', + new Set(['provider', 'model', 'prompt', 'system', 'temperature', 'max-tokens', 'stdin']) + ], + [ + 'image generate', + new Set([ + 'provider', + 'model', + 'prompt', + 'stdin', + 'size', + 'quality', + 'format', + 'compression', + 'background', + 'moderation' + ]) + ], + [ + 'video generate', + new Set([ + 'provider', + 'model', + 'prompt', + 'stdin', + 'seconds', + 'size', + 'ratio', + 'duration', + 'resolution', + 'watermark', + 'audio' + ]) + ], + [ + 'audio speak', + new Set(['provider', 'model', 'text', 'stdin', 'voice', 'format', 'speed', 'instructions']) + ], + ['audio transcribe', new Set(['provider', 'model', 'file', 'artifact', 'mime'])], + ['ocr extract', new Set(['file', 'artifact', 'mime', 'backend', 'page-count', 'max-tokens'])], + ['ocr status', new Set()], + ['ocr clear-cache', new Set()], + ['provider list', new Set(['enabled-only'])], + ['provider test', new Set(['provider', 'model'])], + ['provider add', new Set(['name', 'api-type', 'base-url', 'enabled'])], + ['provider update', new Set(['provider', 'name', 'api-type', 'base-url', 'enabled'])], + ['provider set-credential', new Set(['provider', 'stdin'])], + ['provider clear-credential', new Set(['provider'])], + ['provider remove', new Set(['provider'])], + ['model list', new Set(['provider'])], + ['model config-get', new Set(['provider', 'model'])], + ['model enable', new Set(['provider', 'model'])], + ['model disable', new Set(['provider', 'model'])], + ['model config-set', new Set(['provider', 'model', 'stdin'])], + ['model config-reset', new Set(['provider', 'model'])], + ['settings get', new Set(['keys'])], + ['settings set', new Set(['key', 'value'])], + ['skill list', new Set(['agent'])], + ['skill install', new Set(['agent', 'file', 'url', 'overwrite'])], + ['skill enable', new Set(['agent', 'name'])], + ['skill disable', new Set(['agent', 'name'])], + ['skill remove', new Set(['agent', 'name'])], + ['mcp list', new Set()], + ['mcp add', new Set(['name', 'stdin'])], + ['mcp update', new Set(['name', 'stdin'])], + ['mcp enable', new Set(['name'])], + ['mcp disable', new Set(['name'])], + ['mcp start', new Set(['name'])], + ['mcp stop', new Set(['name'])], + ['mcp remove', new Set(['name'])], + [ + 'agent run', + new Set([ + 'prompt', + 'stdin', + 'agent', + 'provider', + 'model', + 'system', + 'title', + 'project-dir', + 'skills', + 'disable-tools', + 'max-turns' + ]) + ], + ['run get', new Set(['run', 'cursor', 'limit'])], + ['run watch', new Set(['run', 'cursor', 'limit'])], + ['run cancel', new Set(['run'])] +]) + +const AUDIO_MIME_BY_EXTENSION: Readonly> = { + '.aac': 'audio/aac', + '.amr': 'audio/amr', + '.flac': 'audio/flac', + '.m4a': 'audio/mp4', + '.mp3': 'audio/mpeg', + '.mp4': 'audio/mp4', + '.ogg': 'audio/ogg', + '.opus': 'audio/ogg', + '.wav': 'audio/wav', + '.webm': 'audio/webm' +} + +const OCR_MIME_BY_EXTENSION: Readonly> = { + '.bmp': 'image/bmp', + '.gif': 'image/gif', + '.jpeg': 'image/jpeg', + '.jpg': 'image/jpeg', + '.pdf': 'application/pdf', + '.png': 'image/png', + '.tif': 'image/tiff', + '.tiff': 'image/tiff', + '.webp': 'image/webp' +} + +function resolveInputMimeType( + filePath: string, + explicitMimeType: string | undefined, + mimeTypesByExtension: Readonly> +): string { + if (explicitMimeType) return explicitMimeType + const inferred = mimeTypesByExtension[path.extname(filePath).toLowerCase()] + if (!inferred) { + throw new CliUsageError('Cannot infer input MIME type; provide --mime ') + } + return inferred +} + +function parseOutputMode(value: string | undefined): CliOutputMode { + if (value === undefined || value.trim() === '') return 'text' + const normalized = value.trim().toLowerCase() + if (normalized === 'text' || normalized === 'json' || normalized === 'jsonl') return normalized + throw new CliUsageError(`${CLI_OUTPUT_ENV} must be text, json, or jsonl`) +} + +export function inferCliOutputMode( + argv: readonly string[], + env: NodeJS.ProcessEnv = process.env +): CliOutputMode { + if (!argv[0] || !argv[1] || argv[0].startsWith('-') || argv[1].startsWith('-')) return 'text' + const explicit = argv.slice(2).find((argument) => argument === '--json' || argument === '--jsonl') + if (explicit) return explicit.slice(2) as CliOutputMode + try { + return parseOutputMode(env[CLI_OUTPUT_ENV]) + } catch { + return 'text' + } +} + +function parseTimeout(value: string, source: string): number { + if (!/^[1-9][0-9]*$/.test(value)) { + throw new CliUsageError(`${source} must be a positive integer in milliseconds`) + } + const timeoutMs = Number(value) + if (!Number.isSafeInteger(timeoutMs) || timeoutMs > MAX_CLI_TIMEOUT_MS) { + throw new CliUsageError(`${source} must not exceed ${MAX_CLI_TIMEOUT_MS}`) + } + return timeoutMs +} + +function parseIdentifierList(value: string, source: string): string[] { + const items = value + .split(',') + .map((item) => item.trim()) + .filter(Boolean) + if (items.length === 0) throw new CliUsageError(`${source} must contain at least one identifier`) + if (items.length > 128) throw new CliUsageError(`${source} accepts at most 128 identifiers`) + if (new Set(items).size !== items.length) { + throw new CliUsageError(`${source} must not contain duplicate identifiers`) + } + return items +} + +function parseMessagePageCursor(value: string): JsonValue { + let candidate: unknown + try { + candidate = JSON.parse(value) as unknown + } catch { + throw new CliUsageError('--cursor must be a JSON message cursor') + } + const parsed = MessagePageCursorSchema.safeParse(candidate) + if (!parsed.success) throw new CliUsageError('--cursor must be a JSON message cursor') + return parsed.data +} + +export function parseCliArguments( + argv: readonly string[], + env: NodeJS.ProcessEnv = process.env +): ParsedCliArguments { + if (argv[0] === 'help') { + if (argv.length !== 1) throw new CliUsageError('Expected: deepchat help') + return { + domain: 'help', + verb: '', + contract: null, + outputMode: parseOutputMode(env[CLI_OUTPUT_ENV]), + timeoutMs: DEFAULT_CLI_TIMEOUT_MS, + helpRequested: true, + operation: 'rpc', + params: {}, + overwrite: false, + readStdin: false + } + } + + const domain = argv[0] + const verb = argv[1] + if (!domain || !verb || domain.startsWith('-') || verb.startsWith('-')) { + throw new CliUsageError('Expected: deepchat [options]') + } + + const commandKey = cliCommandKey(domain, verb) + const commandDefinition = getCliCommandDefinition(domain, verb) + let contract = commandDefinition?.contract ?? null + if (!contract) { + throw new CliUsageError(`Unknown command: deepchat ${domain} ${verb}`) + } + + let outputMode = parseOutputMode(env[CLI_OUTPUT_ENV]) + let explicitOutputMode: CliOutputMode | undefined + let timeoutMs = env[CLI_TIMEOUT_ENV] + ? parseTimeout(env[CLI_TIMEOUT_ENV], CLI_TIMEOUT_ENV) + : commandDefinition?.timeoutClass === 'long-running' + ? DEFAULT_COMPUTE_TIMEOUT_MS + : commandDefinition?.timeoutClass === 'approved-mutation' + ? DEFAULT_MUTATION_TIMEOUT_MS + : DEFAULT_CLI_TIMEOUT_MS + let timeoutSeen = false + let helpRequested = false + const domainOptions = new Set() + const domainValues = new Map() + + const readOptionValue = ( + argument: string, + index: number + ): { value: string; nextIndex: number } => { + const equalsIndex = argument.indexOf('=') + if (equalsIndex >= 0) { + const value = argument.slice(equalsIndex + 1) + if (!value) throw new CliUsageError(`Missing value for ${argument.slice(0, equalsIndex)}`) + return { value, nextIndex: index } + } + const value = argv[index + 1] + if (!value || value.startsWith('--')) { + throw new CliUsageError(`Missing value for ${argument}`) + } + return { value, nextIndex: index + 1 } + } + + for (let index = 2; index < argv.length; index += 1) { + const argument = argv[index] + if (argument === '--json' || argument === '--jsonl') { + const nextMode = argument.slice(2) as CliOutputMode + if (explicitOutputMode && explicitOutputMode !== nextMode) { + throw new CliUsageError('--json and --jsonl are mutually exclusive') + } + explicitOutputMode = nextMode + outputMode = nextMode + continue + } + if (argument === '--help') { + if (helpRequested) throw new CliUsageError('--help may be specified only once') + helpRequested = true + continue + } + if (argument === '--timeout') { + if (timeoutSeen) throw new CliUsageError('--timeout may be specified only once') + const value = argv[index + 1] + if (!value || value.startsWith('--')) { + throw new CliUsageError('Missing value for --timeout') + } + timeoutMs = parseTimeout(value, '--timeout') + timeoutSeen = true + index += 1 + continue + } + if (argument.startsWith('--timeout=')) { + if (timeoutSeen) throw new CliUsageError('--timeout may be specified only once') + timeoutMs = parseTimeout(argument.slice('--timeout='.length), '--timeout') + timeoutSeen = true + continue + } + if (argument.startsWith('--')) { + const equalsIndex = argument.indexOf('=') + const optionName = argument.slice(2, equalsIndex >= 0 ? equalsIndex : undefined) + if (FLAG_DOMAIN_OPTIONS.has(optionName) && equalsIndex < 0) { + if (domainOptions.has(optionName)) { + throw new CliUsageError(`--${optionName} may be specified only once`) + } + domainOptions.add(optionName) + domainValues.set(optionName, true) + continue + } + const parseValue = VALUE_DOMAIN_OPTIONS[optionName] + if (parseValue) { + if (domainOptions.has(optionName)) { + throw new CliUsageError(`--${optionName} may be specified only once`) + } + const parsedOption = readOptionValue(argument, index) + domainOptions.add(optionName) + domainValues.set(optionName, parseValue(parsedOption.value)) + index = parsedOption.nextIndex + continue + } + } + throw new CliUsageError(`Unknown option after ${domain} ${verb}: ${argument}`) + } + + const getString = (name: string): string | undefined => { + const value = domainValues.get(name) + return typeof value === 'string' ? value : undefined + } + const getNumber = (name: string): number | undefined => { + const value = domainValues.get(name) + return typeof value === 'number' ? value : undefined + } + const getBoolean = (name: string): boolean | undefined => { + const value = domainValues.get(name) + return typeof value === 'boolean' ? value : undefined + } + const artifactId = getString('id') + const inputArtifactId = getString('artifact') + const inputPath = getString('file') + const mimeType = getString('mime') + const outputPath = getString('out') + const overwrite = getBoolean('overwrite') ?? false + const providerId = getString('provider') + const modelId = getString('model') + const prompt = getString('prompt') + const textInput = getString('text') + const systemPrompt = getString('system') + const runId = getString('run') + const cursorValue = getString('cursor') + const title = getString('title') + const projectDir = getString('project-dir') + const skillsValue = getString('skills') + const disabledToolsValue = getString('disable-tools') + const maxTurns = getNumber('max-turns') + const messageLimit = getNumber('limit') + const temperature = getNumber('temperature') + const maxTokens = getNumber('max-tokens') + const readStdin = getBoolean('stdin') ?? false + const enabledOnly = getBoolean('enabled-only') ?? false + const size = getString('size') + const quality = getString('quality') + const format = getString('format') + const compression = getNumber('compression') + const background = getString('background') + const moderation = getString('moderation') + const seconds = getString('seconds') + const ratio = getString('ratio') + const duration = getNumber('duration') + const resolution = getString('resolution') + const watermark = getBoolean('watermark') + const generateAudio = getBoolean('audio') + const voice = getString('voice') + const speed = getNumber('speed') + const instructions = getString('instructions') + const backend = getString('backend') + const sourcePageCountHint = getNumber('page-count') + const settingKey = getString('key') + const settingKeys = getString('keys') + const settingValue = domainValues.get('value') + const providerName = getString('name') + const providerApiType = getString('api-type') + const providerBaseUrl = getString('base-url') + const providerEnabled = getBoolean('enabled') + const agentId = getString('agent') + const skillUrl = getString('url') + const skillName = getString('name') + const mcpServerName = getString('name') + const parsedSettingKeys = settingKeys + ?.split(',') + .map((key) => key.trim()) + .filter(Boolean) + + const isArtifactCommand = domain === 'artifact' + const isSkillInstall = commandKey === 'skill install' + if (!helpRequested && isArtifactCommand && !artifactId) { + throw new CliUsageError(`deepchat ${domain} ${verb} requires --id `) + } + if (!helpRequested && commandKey === 'artifact get' && !outputPath) { + throw new CliUsageError('deepchat artifact get requires --out ') + } + if (!isArtifactCommand && (artifactId !== undefined || outputPath !== undefined)) { + throw new CliUsageError(`Artifact options are not valid for deepchat ${domain} ${verb}`) + } + if (overwrite && commandKey !== 'artifact get' && !isSkillInstall) { + throw new CliUsageError(`--overwrite is not valid for deepchat ${domain} ${verb}`) + } + if ( + isArtifactCommand && + commandKey !== 'artifact get' && + (outputPath !== undefined || overwrite) + ) { + throw new CliUsageError(`--out and --overwrite are only valid for deepchat artifact get`) + } + + const isModelInvoke = commandKey === 'model invoke' + const isImageGenerate = commandKey === 'image generate' + const isVideoGenerate = commandKey === 'video generate' + const isSpeechGenerate = commandKey === 'audio speak' + const isAudioTranscribe = commandKey === 'audio transcribe' + const isOcrExtract = commandKey === 'ocr extract' + const isMediaGenerate = isImageGenerate || isVideoGenerate || isSpeechGenerate + const isProviderList = commandKey === 'provider list' + const isProviderTest = commandKey === 'provider test' + const isProviderAdd = commandKey === 'provider add' + const isProviderUpdate = commandKey === 'provider update' + const isProviderSetCredential = commandKey === 'provider set-credential' + const isProviderClearCredential = commandKey === 'provider clear-credential' + const isProviderRemove = commandKey === 'provider remove' + const isModelList = commandKey === 'model list' + const isModelConfigGet = commandKey === 'model config-get' + const isModelStatus = commandKey === 'model enable' || commandKey === 'model disable' + const isModelConfigSet = commandKey === 'model config-set' + const isModelConfigReset = commandKey === 'model config-reset' + const isSettingsGet = commandKey === 'settings get' + const isSettingsSet = commandKey === 'settings set' + const isSkillList = commandKey === 'skill list' + const isSkillStatus = commandKey === 'skill enable' || commandKey === 'skill disable' + const isSkillRemove = commandKey === 'skill remove' + const isMcpList = commandKey === 'mcp list' + const isMcpAdd = commandKey === 'mcp add' + const isMcpUpdate = commandKey === 'mcp update' + const isMcpStatus = commandKey === 'mcp enable' || commandKey === 'mcp disable' + const isMcpRuntime = commandKey === 'mcp start' || commandKey === 'mcp stop' + const isMcpRemove = commandKey === 'mcp remove' + const isAgentRun = commandKey === 'agent run' + const isRunGet = commandKey === 'run get' + const isRunWatch = commandKey === 'run watch' + const isRunCancel = commandKey === 'run cancel' + const allowedDomainOptions = COMMAND_DOMAIN_OPTIONS.get(commandKey) ?? new Set() + const invalidDomainOption = Array.from(domainOptions).find( + (option) => !allowedDomainOptions.has(option) + ) + if (invalidDomainOption) { + throw new CliUsageError(`--${invalidDomainOption} is not valid for deepchat ${domain} ${verb}`) + } + if (!helpRequested && isModelInvoke && (!providerId || !modelId)) { + throw new CliUsageError('deepchat model invoke requires --provider and --model') + } + if (!helpRequested && isModelInvoke && (prompt !== undefined) === readStdin) { + throw new CliUsageError('deepchat model invoke requires exactly one of --prompt or --stdin') + } + if (!helpRequested && isAgentRun && (prompt !== undefined) === readStdin) { + throw new CliUsageError('deepchat agent run requires exactly one of --prompt or --stdin') + } + if (!helpRequested && (isRunGet || isRunWatch || isRunCancel) && !runId) { + throw new CliUsageError(`deepchat run ${verb} requires --run `) + } + if (!helpRequested && isMediaGenerate && (!providerId || !modelId)) { + throw new CliUsageError(`deepchat ${domain} ${verb} requires --provider and --model`) + } + if ( + !helpRequested && + (isImageGenerate || isVideoGenerate) && + (prompt !== undefined) === readStdin + ) { + throw new CliUsageError( + `deepchat ${domain} ${verb} requires exactly one of --prompt or --stdin` + ) + } + if (!helpRequested && isSpeechGenerate && (textInput !== undefined) === readStdin) { + throw new CliUsageError('deepchat audio speak requires exactly one of --text or --stdin') + } + if (!helpRequested && isAudioTranscribe && (!providerId || !modelId)) { + throw new CliUsageError('deepchat audio transcribe requires --provider and --model') + } + if ( + !helpRequested && + (isAudioTranscribe || isOcrExtract) && + (inputPath !== undefined) === (inputArtifactId !== undefined) + ) { + throw new CliUsageError( + `deepchat ${domain} ${verb} requires exactly one of --file or --artifact` + ) + } + if (!helpRequested && inputArtifactId && mimeType) { + throw new CliUsageError('--mime is only valid together with --file') + } + if (backend !== undefined && backend !== 'auto' && backend !== 'cpu') { + throw new CliUsageError('--backend must be auto or cpu') + } + if (isOcrExtract && maxTokens !== undefined && maxTokens > ATTACHMENT_PDF_OCR_MAX_TOKENS) { + throw new CliUsageError(`--max-tokens must not exceed ${ATTACHMENT_PDF_OCR_MAX_TOKENS}`) + } + if (!helpRequested && isSettingsSet && (!settingKey || !domainOptions.has('value'))) { + throw new CliUsageError('deepchat settings set requires --key and --value') + } + if (!helpRequested && isSettingsGet && settingKeys !== undefined && !parsedSettingKeys?.length) { + throw new CliUsageError('--keys must contain at least one setting key') + } + if (!helpRequested && isProviderAdd && (!providerName || !providerApiType || !providerBaseUrl)) { + throw new CliUsageError('deepchat provider add requires --name, --api-type, and --base-url') + } + if ( + !helpRequested && + isProviderUpdate && + (!providerId || + (providerName === undefined && + providerApiType === undefined && + providerBaseUrl === undefined && + providerEnabled === undefined)) + ) { + throw new CliUsageError('deepchat provider update requires --provider and at least one update') + } + if ( + !helpRequested && + (isProviderTest || + isProviderSetCredential || + isProviderClearCredential || + isProviderRemove || + isModelList) && + !providerId + ) { + throw new CliUsageError(`deepchat ${domain} ${verb} requires --provider`) + } + if (!helpRequested && isProviderSetCredential && !readStdin) { + throw new CliUsageError('deepchat provider set-credential requires --stdin') + } + if ( + !helpRequested && + (isModelConfigGet || isModelStatus || isModelConfigSet || isModelConfigReset) && + (!providerId || !modelId) + ) { + throw new CliUsageError(`deepchat model ${verb} requires --provider and --model`) + } + if (!helpRequested && isModelConfigSet && !readStdin) { + throw new CliUsageError('deepchat model config-set requires --stdin') + } + if (!helpRequested && isSkillInstall && (inputPath !== undefined) === (skillUrl !== undefined)) { + throw new CliUsageError('deepchat skill install requires exactly one of --file or --url') + } + if (!helpRequested && (isSkillStatus || isSkillRemove) && !skillName) { + throw new CliUsageError(`deepchat skill ${verb} requires --name`) + } + if ( + !helpRequested && + (isMcpAdd || isMcpUpdate || isMcpStatus || isMcpRuntime || isMcpRemove) && + !mcpServerName + ) { + throw new CliUsageError(`deepchat mcp ${verb} requires --name`) + } + if (!helpRequested && (isMcpAdd || isMcpUpdate) && !readStdin) { + throw new CliUsageError(`deepchat mcp ${verb} requires --stdin`) + } + + const activeSkills = skillsValue ? parseIdentifierList(skillsValue, '--skills') : undefined + const disabledAgentTools = disabledToolsValue + ? parseIdentifierList(disabledToolsValue, '--disable-tools') + : undefined + const runCursor = + cursorValue && isRunGet + ? parseMessagePageCursor(cursorValue) + : cursorValue && isRunWatch + ? (() => { + const parsed = RunEventCursorSchema.safeParse(cursorValue) + if (!parsed.success) throw new CliUsageError('--cursor is not a valid event cursor') + return parsed.data + })() + : undefined + + let params: JsonValue = artifactId ? { id: artifactId } : {} + if (isProviderList) params = { enabledOnly } + if (isProviderTest && providerId) { + params = { providerId, ...(modelId ? { modelId } : {}) } + } + if (isProviderAdd && providerName && providerApiType && providerBaseUrl) { + params = { + name: providerName, + apiType: providerApiType, + baseUrl: providerBaseUrl, + ...(providerEnabled !== undefined ? { enabled: providerEnabled } : {}) + } + } + if (isProviderUpdate && providerId) { + params = { + providerId, + updates: { + ...(providerName !== undefined ? { name: providerName } : {}), + ...(providerApiType !== undefined ? { apiType: providerApiType } : {}), + ...(providerBaseUrl !== undefined ? { baseUrl: providerBaseUrl } : {}), + ...(providerEnabled !== undefined ? { enabled: providerEnabled } : {}) + } + } + } + if (isProviderSetCredential && providerId) { + params = { providerId, action: 'set', kind: 'api-key' } + } + if (isProviderClearCredential && providerId) { + params = { providerId, action: 'clear', kind: 'api-key' } + } + if (isProviderRemove && providerId) params = { providerId } + if (isModelList && providerId) params = { providerId } + if (isModelConfigGet && providerId && modelId) params = { providerId, modelId } + if (isModelStatus && providerId && modelId) { + params = { providerId, modelId, enabled: commandKey === 'model enable' } + } + if (isModelConfigSet && providerId && modelId) params = { providerId, modelId } + if (isModelConfigReset && providerId && modelId) params = { providerId, modelId } + if (isSettingsGet) { + params = parsedSettingKeys ? { keys: parsedSettingKeys } : {} + } + if (isSettingsSet && settingKey && domainOptions.has('value')) { + params = { changes: [{ key: settingKey, value: settingValue ?? null }] } + } + if (isSkillList) params = agentId ? { agentId } : {} + if (isSkillInstall) { + if (inputPath) { + contract = skillsInstallUploadRoute + params = { + ...(agentId ? { agentId } : {}), + filename: path.basename(inputPath), + overwrite + } + } else if (skillUrl) { + contract = skillsInstallPublicUrlRoute + params = { + ...(agentId ? { agentId } : {}), + url: skillUrl, + overwrite + } + } + } + if (isSkillStatus && skillName) { + params = { + ...(agentId ? { agentId } : {}), + name: skillName, + enabled: commandKey === 'skill enable' + } + } + if (isSkillRemove && skillName) { + params = { ...(agentId ? { agentId } : {}), name: skillName } + } + if (isMcpList) params = {} + if ((isMcpAdd || isMcpUpdate) && mcpServerName) params = { serverName: mcpServerName } + if (isMcpStatus && mcpServerName) { + params = { serverName: mcpServerName, enabled: commandKey === 'mcp enable' } + } + if ((isMcpRuntime || isMcpRemove) && mcpServerName) params = { serverName: mcpServerName } + if (isAgentRun) { + params = { + ...(prompt !== undefined ? { prompt } : {}), + ...(agentId ? { agentId } : {}), + ...(title ? { title } : {}), + ...(projectDir ? { projectDir } : {}), + ...(providerId ? { providerId } : {}), + ...(modelId ? { modelId } : {}), + ...(systemPrompt !== undefined ? { systemPrompt } : {}), + ...(activeSkills ? { activeSkills } : {}), + ...(disabledAgentTools ? { disabledAgentTools } : {}), + ...(maxTurns !== undefined ? { maxTurns } : {}) + } + } + if (isRunGet && runId) { + params = { + runId, + ...(runCursor ? { cursor: runCursor } : {}), + ...(messageLimit !== undefined ? { limit: messageLimit } : {}) + } + } + if (isRunWatch && runId) { + params = { + runId, + ...(runCursor ? { cursor: runCursor } : {}), + ...(messageLimit !== undefined ? { messageLimit } : {}) + } + } + if (isRunCancel && runId) params = { runId } + if (isModelInvoke && providerId && modelId) { + params = { + providerId, + modelId, + messages: [ + ...(systemPrompt ? [{ role: 'system', content: systemPrompt }] : []), + ...(prompt !== undefined ? [{ role: 'user', content: prompt }] : []) + ], + ...(temperature !== undefined ? { temperature } : {}), + ...(maxTokens !== undefined ? { maxTokens } : {}) + } + } + if (isImageGenerate && providerId && modelId) { + const options = { + ...(size !== undefined ? { size } : {}), + ...(quality !== undefined ? { quality } : {}), + ...(format !== undefined ? { outputFormat: format } : {}), + ...(compression !== undefined ? { outputCompression: compression } : {}), + ...(background !== undefined ? { background } : {}), + ...(moderation !== undefined ? { moderation } : {}) + } + params = { + providerId, + modelId, + ...(prompt !== undefined ? { prompt } : {}), + ...(Object.keys(options).length > 0 ? { options } : {}) + } + } + if (isVideoGenerate && providerId && modelId) { + const options = { + ...(seconds !== undefined ? { seconds } : {}), + ...(size !== undefined ? { size } : {}), + ...(ratio !== undefined ? { ratio } : {}), + ...(duration !== undefined ? { duration } : {}), + ...(resolution !== undefined ? { resolution } : {}), + ...(watermark !== undefined ? { watermark } : {}), + ...(generateAudio !== undefined ? { generateAudio } : {}) + } + params = { + providerId, + modelId, + ...(prompt !== undefined ? { prompt } : {}), + ...(Object.keys(options).length > 0 ? { options } : {}) + } + } + if (isSpeechGenerate && providerId && modelId) { + const options = { + ...(voice !== undefined ? { voice } : {}), + ...(format !== undefined ? { responseFormat: format } : {}), + ...(speed !== undefined ? { speed } : {}), + ...(instructions !== undefined ? { instructions } : {}) + } + params = { + providerId, + modelId, + ...(textInput !== undefined ? { text: textInput } : {}), + ...(Object.keys(options).length > 0 ? { options } : {}) + } + } + if (isAudioTranscribe && providerId && modelId && (inputPath || inputArtifactId)) { + if (inputPath) { + contract = audioTranscribeUploadRoute + params = { + providerId, + modelId, + mimeType: resolveInputMimeType(inputPath, mimeType, AUDIO_MIME_BY_EXTENSION), + filename: path.basename(inputPath) + } + } else if (inputArtifactId) { + contract = audioTranscribeArtifactRoute + params = { providerId, modelId, artifactId: inputArtifactId } + } + } + if (isOcrExtract && (inputPath || inputArtifactId)) { + const options = { + ...(backend !== undefined ? { backend } : {}), + ...(sourcePageCountHint !== undefined ? { sourcePageCountHint } : {}), + ...(maxTokens !== undefined ? { generationTokenLimit: maxTokens } : {}) + } + if (inputPath) { + const resolvedMimeType = resolveInputMimeType(inputPath, mimeType, OCR_MIME_BY_EXTENSION) + if ( + resolvedMimeType !== 'application/pdf' && + (sourcePageCountHint !== undefined || maxTokens !== undefined) + ) { + throw new CliUsageError('--page-count and --max-tokens are only valid for PDF input') + } + contract = ocrExtractUploadRoute + params = { + ...options, + mimeType: resolvedMimeType + } + } else if (inputArtifactId) { + contract = ocrExtractArtifactRoute + params = { ...options, artifactId: inputArtifactId } + } + } + + return { + domain, + verb, + contract, + outputMode, + timeoutMs, + helpRequested, + operation: + commandKey === 'artifact get' + ? 'download' + : inputPath && (isAudioTranscribe || isOcrExtract || isSkillInstall) + ? 'upload' + : isModelInvoke || isMediaGenerate || isRunWatch + ? 'stream' + : 'rpc', + params, + ...(inputPath ? { inputPath } : {}), + ...(isAudioTranscribe && inputPath + ? { uploadMaxBytes: AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES } + : {}), + ...(isOcrExtract && inputPath ? { uploadMaxBytes: OCR_EXTRACTION_MAX_INPUT_BYTES } : {}), + ...(isSkillInstall && inputPath ? { uploadMaxBytes: SKILL_ARCHIVE_MAX_INPUT_BYTES } : {}), + ...(outputPath ? { outputPath } : {}), + overwrite, + readStdin + } +} + +export function formatCliHelp(command?: Pick): string { + if (command && command.domain !== 'help') { + const commandOptions = + command.domain === 'artifact' + ? command.verb === 'get' + ? ' --id --out [--overwrite]' + : ' --id ' + : command.domain === 'agent' + ? ' (--prompt |--stdin) [--agent ] [--provider ] [--model ]' + : command.domain === 'run' + ? command.verb === 'get' + ? ' --run [--cursor ] [--limit ]' + : command.verb === 'watch' + ? ' --run [--cursor ] [--limit ]' + : ' --run ' + : command.domain === 'model' + ? command.verb === 'invoke' + ? ' --provider --model (--prompt |--stdin)' + : command.verb === 'list' + ? ' --provider ' + : ` --provider --model ${command.verb === 'config-set' ? ' --stdin' : ''}` + : command.domain === 'image' || command.domain === 'video' + ? ' --provider --model (--prompt |--stdin)' + : command.domain === 'audio' && command.verb === 'speak' + ? ' --provider --model (--text |--stdin)' + : command.domain === 'audio' + ? ' --provider --model (--file |--artifact )' + : command.domain === 'ocr' && command.verb === 'extract' + ? ' (--file |--artifact )' + : command.domain === 'provider' + ? command.verb === 'list' + ? ' [--enabled-only]' + : command.verb === 'add' + ? ' --name --api-type --base-url [--enabled ]' + : command.verb === 'update' + ? ' --provider [--name ] [--api-type ] [--base-url ] [--enabled ]' + : command.verb === 'set-credential' + ? ' --provider --stdin' + : ` --provider ${command.verb === 'test' ? ' [--model ]' : ''}` + : command.domain === 'settings' && command.verb === 'get' + ? ' [--keys ]' + : command.domain === 'settings' + ? ' --key --value ' + : command.domain === 'skill' + ? command.verb === 'list' + ? ' [--agent ]' + : command.verb === 'install' + ? ' (--file |--url ) [--agent ] [--overwrite]' + : ' --name [--agent ]' + : command.domain === 'mcp' + ? command.verb === 'list' + ? '' + : command.verb === 'add' || command.verb === 'update' + ? ' --name --stdin' + : ' --name ' + : '' + const commandKey = `${command.domain} ${command.verb}` + const optionLines = + commandKey === 'model invoke' + ? [ + ' --system Add a system message', + ' --temperature Set sampling temperature (0..2)', + ' --max-tokens Set the output-token limit' + ] + : commandKey === 'agent run' + ? [ + ' --system Override the Agent system prompt', + ' --title Set the durable session title', + ' --project-dir Set the Agent working directory', + ' --skills Activate selected Skills', + ' --disable-tools Disable selected Agent tools', + ' --max-turns Limit provider rounds (1..100)' + ] + : commandKey === 'run get' + ? [' --cursor Read the next older message page'] + : commandKey === 'run watch' + ? [' --cursor Resume after an event cursor'] + : commandKey === 'image generate' + ? [ + ' --size Set output dimensions', + ' --quality Set low, medium, high, or auto quality', + ' --format Set png, jpeg, or webp output', + ' --compression Set jpeg/webp compression (0..100)', + ' --background Set auto or opaque background', + ' --moderation Set auto or low moderation' + ] + : commandKey === 'video generate' + ? [ + ' --seconds Set provider-specific clip seconds', + ' --size Set provider-specific dimensions', + ' --ratio Set aspect ratio', + ' --duration Set duration (-1..3600)', + ' --resolution Set output resolution', + ' --watermark Enable or disable watermarking', + ' --audio Enable or disable generated audio' + ] + : commandKey === 'audio speak' + ? [ + ' --voice Select a voice', + ' --format Set mp3, opus, aac, flac, wav, or pcm', + ' --speed Set playback speed (0.25..4)', + ' --instructions Add provider-supported speech guidance' + ] + : commandKey === 'audio transcribe' + ? [' --mime Override the MIME type inferred from --file'] + : commandKey === 'ocr extract' + ? [ + ' --mime Override the MIME type inferred from --file', + ' --backend Select auto or cpu', + ' --page-count Provide a PDF page-count hint', + ' --max-tokens Limit PDF OCR output tokens' + ] + : [] + return [ + `Usage: deepchat ${command.domain} ${command.verb}${commandOptions} [--json|--jsonl] [--timeout ]`, + '', + 'Global flags must follow the domain and verb.', + ...(optionLines.length > 0 ? ['', 'Command options:', ...optionLines] : []) + ].join('\n') + } + + return [ + 'Usage: deepchat [options]', + '', + 'Commands:', + ' system status Show local control-plane status', + ' system version Show app and protocol versions', + ' system capabilities List the exposed CLI surface', + ' system doctor Run local transport diagnostics', + ' artifact describe Show owned artifact metadata', + ' artifact get Download an owned artifact', + ' artifact delete Delete an owned artifact', + ' model invoke Stream a raw text-model invocation', + ' image generate Generate image artifacts', + ' video generate Generate video artifacts', + ' audio speak Generate a speech artifact', + ' audio transcribe Transcribe an audio file or owned artifact', + ' ocr status Show offline OCR runtime and cache status', + ' ocr extract Extract text from an image or PDF', + ' ocr clear-cache Clear derived OCR cache entries', + ' provider list List redacted providers and models', + ' provider test Test a provider connection', + ' provider add Add a credential-free custom provider', + ' provider update Update allowlisted provider fields', + ' provider set-credential Read and store an API key from stdin', + ' provider clear-credential Clear a stored API key', + ' provider remove Remove a custom provider', + ' model list List runtime models for a provider', + ' model enable Enable one model', + ' model disable Disable one model', + ' model config-get Read effective model configuration', + ' model config-set Read full model configuration JSON from stdin', + ' model config-reset Reset user model configuration', + ' settings get Read allowlisted public settings', + ' settings set Update one allowlisted public setting', + ' skill list List redacted Skills for one Agent', + ' skill install Install a Skill from a ZIP file or HTTPS URL', + ' skill enable Enable one Skill', + ' skill disable Disable one Skill', + ' skill remove Remove one mutable Skill', + ' mcp list List redacted MCP server summaries', + ' mcp add Read a new MCP server configuration from stdin', + ' mcp update Read an MCP server update from stdin', + ' mcp enable Enable and start one MCP server', + ' mcp disable Disable and stop one MCP server', + ' mcp start Start one configured MCP server', + ' mcp stop Stop one configured MCP server', + ' mcp remove Remove one MCP server', + ' agent run Start a durable detached Agent run', + ' run get Read an owned run snapshot and messages', + ' run watch Stream targeted run events with a resume cursor', + ' run cancel Idempotently cancel an owned active run', + ' help Show this help', + '', + 'Options (after domain and verb):', + ' --json Emit one JSON result envelope', + ' --jsonl Emit JSONL records', + ' --timeout Set request timeout', + ' --help Show command usage and options', + '', + 'Run deepchat --help for command-specific options.' + ].join('\n') +} diff --git a/src/cli/artifacts.ts b/src/cli/artifacts.ts new file mode 100644 index 0000000000..d66f5c2ddc --- /dev/null +++ b/src/cli/artifacts.ts @@ -0,0 +1,287 @@ +import { createHash, randomUUID } from 'node:crypto' +import { link, open, rename, unlink, type FileHandle } from 'node:fs/promises' +import { request as httpRequest, type IncomingMessage } from 'node:http' +import path from 'node:path' +import { + LOCAL_CONTROL_ARTIFACT_PATH_PREFIX, + LocalControlRpcResponseSchema, + type LocalControlDescriptor +} from '@shared/contracts/localControl' +import type { ArtifactMetadata } from '@shared/contracts/routes/artifacts.routes' +import { isHardlinkUnavailableError } from '@shared/utils/filesystem' +import { CLI_EXIT_CODES, CliClientError, exitCodeForRemoteError } from './errors' +import { CLI_VERSION } from './transport' + +const MAX_ERROR_RESPONSE_BYTES = 64 * 1024 +const PORTABLE_COPY_BUFFER_BYTES = 64 * 1024 + +export type ArtifactDownloadInput = Readonly<{ + descriptor: LocalControlDescriptor + token: string + metadata: ArtifactMetadata + outputPath: string + overwrite: boolean + signal: AbortSignal +}> + +function protocolFailure(message: string): CliClientError { + return new CliClientError('internal_error', message, CLI_EXIT_CODES.internal) +} + +function transportFailure(message: string): CliClientError { + return new CliClientError('unavailable', message, CLI_EXIT_CODES.unavailable, true) +} + +function abortReason(signal: AbortSignal): Error { + return signal.reason instanceof Error + ? signal.reason + : new CliClientError('cancelled', 'CLI request was cancelled', CLI_EXIT_CODES.cancelled) +} + +function singularHeader(response: IncomingMessage, name: string): string | undefined { + const values = response.headersDistinct[name] + if (values && values.length !== 1) { + throw protocolFailure(`DeepChat returned multiple ${name} headers`) + } + const value = values?.[0] ?? response.headers[name] + if (Array.isArray(value)) throw protocolFailure(`DeepChat returned an invalid ${name} header`) + return value +} + +async function writeAll(handle: FileHandle, chunk: Buffer, position: number): Promise { + let offset = 0 + while (offset < chunk.length) { + const { bytesWritten } = await handle + .write(chunk, offset, chunk.length - offset, position + offset) + .catch((error) => { + throw new CliClientError( + 'conflict', + `Cannot write artifact output: ${(error as Error).message}`, + CLI_EXIT_CODES.domain + ) + }) + if (bytesWritten <= 0) throw new Error('Artifact output write made no progress') + offset += bytesWritten + } + return offset +} + +async function readRemoteFailure(response: IncomingMessage): Promise { + const chunks: Buffer[] = [] + let size = 0 + for await (const rawChunk of response) { + const chunk = Buffer.from(rawChunk) + size += chunk.length + if (size > MAX_ERROR_RESPONSE_BYTES) { + throw protocolFailure('DeepChat artifact error response exceeds the byte limit') + } + chunks.push(chunk) + } + + try { + const parsed = LocalControlRpcResponseSchema.parse( + JSON.parse(Buffer.concat(chunks, size).toString('utf8')) + ) + if (parsed.ok) + throw protocolFailure('DeepChat returned a success envelope with an error status') + return new CliClientError( + parsed.error.code, + parsed.error.message, + exitCodeForRemoteError(parsed.error), + parsed.error.retriable + ) + } catch (error) { + if (error instanceof CliClientError) return error + return protocolFailure('DeepChat returned an invalid artifact error response') + } +} + +async function receiveArtifact(input: ArtifactDownloadInput, handle: FileHandle): Promise { + if (input.signal.aborted) throw abortReason(input.signal) + + await new Promise((resolve, reject) => { + let settled = false + const finish = (callback: () => void) => { + if (settled) return + settled = true + callback() + } + const request = httpRequest({ + socketPath: + input.descriptor.endpoint.kind === 'unix' + ? input.descriptor.endpoint.path + : input.descriptor.endpoint.name, + path: `${LOCAL_CONTROL_ARTIFACT_PATH_PREFIX}${input.metadata.id}`, + method: 'GET', + agent: false, + signal: input.signal, + headers: { + authorization: `Bearer ${input.token}`, + connection: 'close', + 'user-agent': `DeepChat-CLI/${CLI_VERSION}` + } + }) + + request.once('response', (response) => { + void (async () => { + if ((response.statusCode ?? 0) < 200 || (response.statusCode ?? 0) >= 300) { + throw await readRemoteFailure(response) + } + + const contentLength = singularHeader(response, 'content-length') + const contentType = singularHeader(response, 'content-type') + const artifactId = singularHeader(response, 'x-deepchat-artifact-id') + const expectedHash = singularHeader(response, 'x-content-sha256') + if (!contentLength || !/^(0|[1-9][0-9]*)$/.test(contentLength)) { + throw protocolFailure('DeepChat returned an invalid artifact Content-Length') + } + if (Number(contentLength) !== input.metadata.size) { + throw protocolFailure('DeepChat artifact size changed after description') + } + if (contentType?.trim().toLowerCase() !== input.metadata.mimeType.toLowerCase()) { + throw protocolFailure('DeepChat artifact MIME type changed after description') + } + if (artifactId !== input.metadata.id || expectedHash !== input.metadata.sha256) { + throw protocolFailure('DeepChat artifact identity changed after description') + } + + const hash = createHash('sha256') + let bytesWritten = 0 + for await (const rawChunk of response) { + if (input.signal.aborted) throw abortReason(input.signal) + const chunk = Buffer.from(rawChunk) + if (bytesWritten + chunk.length > input.metadata.size) { + throw protocolFailure('DeepChat artifact exceeded its declared size') + } + hash.update(chunk) + bytesWritten += await writeAll(handle, chunk, bytesWritten) + } + if (bytesWritten !== input.metadata.size) { + throw protocolFailure('DeepChat artifact was truncated') + } + if (hash.digest('hex') !== input.metadata.sha256) { + throw protocolFailure('DeepChat artifact checksum did not match') + } + })().then( + () => finish(resolve), + (error: unknown) => { + response.destroy() + finish(() => + reject( + error instanceof CliClientError + ? error + : transportFailure( + error instanceof Error ? error.message : 'Artifact download failed' + ) + ) + ) + } + ) + }) + request.once('error', (error: NodeJS.ErrnoException) => { + if (input.signal.aborted) { + finish(() => reject(abortReason(input.signal))) + return + } + finish(() => reject(transportFailure(`Cannot download artifact: ${error.message}`))) + }) + request.end() + }) +} + +function outputAlreadyExists(outputPath: string): CliClientError { + return new CliClientError( + 'conflict', + `Output already exists: ${outputPath}`, + CLI_EXIT_CODES.domain + ) +} + +async function copyDownloadExclusive(tempPath: string, outputPath: string): Promise { + let output: FileHandle | undefined + let source: FileHandle | undefined + try { + output = await open(outputPath, 'wx', 0o600) + source = await open(tempPath, 'r') + const buffer = Buffer.allocUnsafe(PORTABLE_COPY_BUFFER_BYTES) + let position = 0 + while (true) { + const { bytesRead } = await source.read(buffer, 0, buffer.length, position) + if (bytesRead === 0) break + position += await writeAll(output, buffer.subarray(0, bytesRead), position) + } + await output.sync() + await source.close() + source = undefined + await output.close() + output = undefined + } catch (error) { + await source?.close().catch(() => undefined) + await output?.close().catch(() => undefined) + if (output) await unlink(outputPath).catch(() => undefined) + if ((error as NodeJS.ErrnoException).code === 'EEXIST') throw outputAlreadyExists(outputPath) + throw error + } +} + +export async function publishArtifactDownload( + tempPath: string, + outputPath: string, + overwrite: boolean, + linkFile: typeof link = link +): Promise { + if (!overwrite) { + try { + await linkFile(tempPath, outputPath) + return + } catch (error) { + const code = (error as NodeJS.ErrnoException).code + if (code === 'EEXIST') throw outputAlreadyExists(outputPath) + if (!isHardlinkUnavailableError(error)) throw error + } + await copyDownloadExclusive(tempPath, outputPath) + return + } + + await rename(tempPath, outputPath) +} + +export async function downloadArtifact(input: ArtifactDownloadInput): Promise { + const outputPath = path.resolve(input.outputPath) + if (outputPath.includes('\0')) { + throw new CliClientError('invalid_request', 'Output path contains NUL', CLI_EXIT_CODES.usage) + } + const tempPath = path.join(path.dirname(outputPath), `.deepchat-${randomUUID()}.tmp`) + const handle = await open(tempPath, 'wx', 0o600).catch((error) => { + throw new CliClientError( + 'conflict', + `Cannot create temporary output beside ${outputPath}: ${(error as Error).message}`, + CLI_EXIT_CODES.domain + ) + }) + let handleOpen = true + try { + await receiveArtifact(input, handle) + await handle.sync().catch((error) => { + throw new CliClientError( + 'conflict', + `Cannot flush artifact output: ${(error as Error).message}`, + CLI_EXIT_CODES.domain + ) + }) + await handle.close() + handleOpen = false + await publishArtifactDownload(tempPath, outputPath, input.overwrite).catch((error) => { + if (error instanceof CliClientError) throw error + throw new CliClientError( + 'conflict', + `Cannot publish artifact output: ${(error as Error).message}`, + CLI_EXIT_CODES.domain + ) + }) + return outputPath + } finally { + if (handleOpen) await handle.close().catch(() => undefined) + await unlink(tempPath).catch(() => undefined) + } +} diff --git a/src/cli/discovery.ts b/src/cli/discovery.ts new file mode 100644 index 0000000000..6b270c0088 --- /dev/null +++ b/src/cli/discovery.ts @@ -0,0 +1,190 @@ +import { lstat, readFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + LOCAL_CONTROL_DESCRIPTOR_FILENAME, + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION, + LocalControlDescriptorSchema, + LocalControlTokenSchema, + type LocalControlDescriptor +} from '@shared/contracts/localControl' +import { CLI_EXIT_CODES, CliClientError } from './errors' + +const MAX_DESCRIPTOR_BYTES = 64 * 1024 +const EXPLICIT_PROFILE_ENV = 'DEEPCHAT_E2E_USER_DATA_DIR' +const MAX_POSIX_SOCKET_PATH_BYTES = 100 + +export type CliDiscoveryOptions = Readonly<{ + env?: NodeJS.ProcessEnv + platform?: NodeJS.Platform + homeDirectory?: string + processAlive?: (pid: number) => boolean +}> + +function resolveDefaultProfilePath( + env: NodeJS.ProcessEnv, + platform: NodeJS.Platform, + homeDirectory: string +): string { + if (platform === 'darwin') { + return path.join(homeDirectory, 'Library', 'Application Support', 'DeepChat') + } + if (platform === 'win32') { + return path.join(env.APPDATA ?? path.join(homeDirectory, 'AppData', 'Roaming'), 'DeepChat') + } + return path.join(env.XDG_CONFIG_HOME ?? path.join(homeDirectory, '.config'), 'DeepChat') +} + +export function resolveCliUserDataPath(options: CliDiscoveryOptions = {}): string { + const env = options.env ?? process.env + const explicitPath = env[EXPLICIT_PROFILE_ENV]?.trim() + if (explicitPath) return path.resolve(explicitPath) + return resolveDefaultProfilePath( + env, + options.platform ?? process.platform, + options.homeDirectory ?? os.homedir() + ) +} + +function defaultProcessAlive(pid: number): boolean { + try { + process.kill(pid, 0) + return true + } catch (error) { + const code = (error as NodeJS.ErrnoException).code + if (code === 'EPERM') return true + if (code === 'ESRCH') return false + throw error + } +} + +function unavailable(message: string): CliClientError { + return new CliClientError('unavailable', message, CLI_EXIT_CODES.unavailable, true) +} + +export async function loadLocalControlDescriptor( + options: CliDiscoveryOptions = {} +): Promise { + const platform = options.platform ?? process.platform + const descriptorPath = path.join( + resolveCliUserDataPath(options), + 'local-control', + LOCAL_CONTROL_DESCRIPTOR_FILENAME + ) + + let descriptorStat + try { + descriptorStat = await lstat(descriptorPath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + throw unavailable('DeepChat is not running or its CLI descriptor is unavailable') + } + throw unavailable(`Cannot inspect the DeepChat CLI descriptor: ${(error as Error).message}`) + } + if (!descriptorStat.isFile() || descriptorStat.isSymbolicLink()) { + throw unavailable('DeepChat CLI descriptor is not a regular file') + } + if (descriptorStat.size <= 0 || descriptorStat.size > MAX_DESCRIPTOR_BYTES) { + throw unavailable('DeepChat CLI descriptor has an invalid size') + } + if (platform !== 'win32') { + if (typeof process.getuid === 'function' && descriptorStat.uid !== process.getuid()) { + throw unavailable('DeepChat CLI descriptor is owned by another user') + } + if ((descriptorStat.mode & 0o077) !== 0) { + throw unavailable('DeepChat CLI descriptor permissions are not private') + } + } + + let serialized: string + try { + serialized = await readFile(descriptorPath, 'utf8') + } catch (error) { + throw unavailable(`Cannot read the DeepChat CLI descriptor: ${(error as Error).message}`) + } + + let raw: unknown + try { + raw = JSON.parse(serialized) as unknown + } catch { + throw unavailable('DeepChat CLI descriptor is not valid JSON') + } + if (!raw || typeof raw !== 'object' || Array.isArray(raw)) { + throw unavailable('DeepChat CLI descriptor has an invalid shape') + } + const versioned = raw as Record + if ( + typeof versioned.protocolVersion !== 'number' || + typeof versioned.surfaceVersion !== 'number' + ) { + throw unavailable('DeepChat CLI descriptor has no valid protocol version') + } + if ( + versioned.protocolVersion !== LOCAL_CONTROL_PROTOCOL_VERSION || + versioned.surfaceVersion !== LOCAL_CONTROL_SURFACE_VERSION + ) { + throw new CliClientError( + 'unsupported_version', + `CLI requires protocol ${LOCAL_CONTROL_PROTOCOL_VERSION} and surface ${LOCAL_CONTROL_SURFACE_VERSION}; descriptor has protocol ${versioned.protocolVersion} and surface ${versioned.surfaceVersion}`, + CLI_EXIT_CODES.unavailable + ) + } + + const parsed = LocalControlDescriptorSchema.safeParse(raw) + if (!parsed.success) throw unavailable('DeepChat CLI descriptor failed validation') + const descriptor = parsed.data + if (!(options.processAlive ?? defaultProcessAlive)(descriptor.pid)) { + throw unavailable('DeepChat CLI descriptor points to a stopped process') + } + + if (platform === 'win32') { + if ( + descriptor.endpoint.kind !== 'pipe' || + !descriptor.endpoint.name.startsWith('\\\\.\\pipe\\') + ) { + throw unavailable('DeepChat CLI descriptor does not contain a local named pipe') + } + } else { + if ( + descriptor.endpoint.kind !== 'unix' || + !path.isAbsolute(descriptor.endpoint.path) || + Buffer.byteLength(descriptor.endpoint.path) > MAX_POSIX_SOCKET_PATH_BYTES + ) { + throw unavailable('DeepChat CLI descriptor does not contain a valid Unix socket') + } + try { + const socketStat = await lstat(descriptor.endpoint.path) + if (!socketStat.isSocket()) throw unavailable('DeepChat CLI endpoint is not a Unix socket') + if (typeof process.getuid === 'function' && socketStat.uid !== process.getuid()) { + throw unavailable('DeepChat CLI endpoint is owned by another user') + } + if ((socketStat.mode & 0o077) !== 0) { + throw unavailable('DeepChat CLI endpoint permissions are not private') + } + } catch (error) { + if (error instanceof CliClientError) throw error + throw unavailable('DeepChat CLI Unix socket is unavailable') + } + } + return descriptor +} + +export function selectLocalControlToken( + descriptor: LocalControlDescriptor, + env: NodeJS.ProcessEnv = process.env +): string { + if (Object.prototype.hasOwnProperty.call(env, LOCAL_CONTROL_AGENT_TOKEN_ENV)) { + const token = LocalControlTokenSchema.safeParse(env[LOCAL_CONTROL_AGENT_TOKEN_ENV]) + if (!token.success) { + throw new CliClientError( + 'authentication_failed', + `${LOCAL_CONTROL_AGENT_TOKEN_ENV} is present but invalid; refusing human-token fallback`, + CLI_EXIT_CODES.authorization + ) + } + return token.data + } + return descriptor.token +} diff --git a/src/cli/errors.ts b/src/cli/errors.ts new file mode 100644 index 0000000000..1f1959b81d --- /dev/null +++ b/src/cli/errors.ts @@ -0,0 +1,60 @@ +import type { LocalControlError, LocalControlErrorCode } from '@shared/contracts/localControl' + +const MAX_CLI_ERROR_MESSAGE_LENGTH = 4_096 + +export const CLI_EXIT_CODES = { + success: 0, + usage: 2, + unavailable: 3, + authorization: 4, + approval: 5, + domain: 6, + cancelled: 7, + internal: 8 +} as const + +export type CliExitCode = (typeof CLI_EXIT_CODES)[keyof typeof CLI_EXIT_CODES] + +export class CliUsageError extends Error { + constructor(message: string) { + super(message) + this.name = 'CliUsageError' + } +} + +export class CliClientError extends Error { + constructor( + readonly code: LocalControlErrorCode, + message: string, + readonly exitCode: CliExitCode, + readonly retriable = false + ) { + super( + (message.length > 0 ? message : 'CLI request failed').slice(0, MAX_CLI_ERROR_MESSAGE_LENGTH) + ) + this.name = 'CliClientError' + } +} + +export function exitCodeForRemoteError(error: LocalControlError): CliExitCode { + switch (error.code) { + case 'authentication_failed': + case 'permission_denied': + return CLI_EXIT_CODES.authorization + case 'approval_denied': + case 'approval_timeout': + return CLI_EXIT_CODES.approval + case 'cancelled': + case 'timeout': + return CLI_EXIT_CODES.cancelled + case 'unsupported_version': + case 'unavailable': + return CLI_EXIT_CODES.unavailable + case 'invalid_request': + return CLI_EXIT_CODES.usage + case 'internal_error': + return CLI_EXIT_CODES.internal + default: + return CLI_EXIT_CODES.domain + } +} diff --git a/src/cli/format.ts b/src/cli/format.ts new file mode 100644 index 0000000000..c60ffe7939 --- /dev/null +++ b/src/cli/format.ts @@ -0,0 +1,291 @@ +import type { JsonValue } from '@shared/contracts/json' +import type { LocalControlRpcResponse } from '@shared/contracts/localControl' +import type { CliRpcContract } from './args' +import { CLI_VERSION } from './transport' + +function formatDuration(milliseconds: number): string { + if (milliseconds < 1_000) return `${milliseconds}ms` + const seconds = Math.floor(milliseconds / 1_000) + const hours = Math.floor(seconds / 3_600) + const minutes = Math.floor((seconds % 3_600) / 60) + const remainder = seconds % 60 + return [hours > 0 ? `${hours}h` : '', minutes > 0 ? `${minutes}m` : '', `${remainder}s`] + .filter(Boolean) + .join(' ') +} + +function formatMcpRuntime(running: boolean | null): string { + return running === null ? 'unknown' : running ? 'running' : 'stopped' +} + +function unsupportedCliContract(contract: never): never { + const name = (contract as { name?: unknown }).name + throw new Error(`Unsupported CLI contract: ${typeof name === 'string' ? name : 'unknown'}`) +} + +export function formatHumanResult( + contract: CliRpcContract, + value: JsonValue, + context: { outputPath?: string } = {} +): string { + switch (contract.name) { + case 'cli.status': { + const result = contract.output.parse(value) + return [ + result.running ? 'DeepChat is running' : 'DeepChat is stopped', + `PID: ${result.pid}`, + `Uptime: ${formatDuration(result.uptimeMs)}`, + `Endpoint: ${result.endpointKind}`, + `Connections: ${result.activeConnections}`, + `Pending requests: ${result.pendingRequests}` + ].join('\n') + } + case 'cli.version': { + const result = contract.output.parse(value) + return [ + `DeepChat ${result.appVersion}`, + `CLI ${CLI_VERSION}`, + `Protocol ${result.protocolVersion}, surface ${result.surfaceVersion}` + ].join('\n') + } + case 'cli.capabilities': { + const result = contract.output.parse(value) + return [ + `CLI surface ${result.surfaceVersion} (${result.capabilities.length} methods)`, + ...result.capabilities.map( + (capability) => + `${capability.method} ${capability.possibleEffects.join(',')} ${capability.callers.join(',')} ${capability.transport}` + ) + ].join('\n') + } + case 'cli.doctor': { + const result = contract.output.parse(value) + return [ + `DeepChat CLI doctor: ${result.healthy ? 'healthy' : 'unhealthy'}`, + ...result.checks.map( + (check) => `[${check.status.toUpperCase()}] ${check.id}: ${check.message}` + ) + ].join('\n') + } + case 'artifacts.describe': { + const { artifact } = contract.output.parse(value) + return [ + `${artifact.id} ${artifact.mimeType} ${artifact.size} bytes`, + `SHA-256: ${artifact.sha256}`, + `Expires: ${new Date(artifact.expiresAt).toISOString()}` + ].join('\n') + } + case 'artifacts.read': { + const { artifact } = contract.output.parse(value) + return `Saved ${artifact.size} bytes to ${context.outputPath ?? artifact.filename}` + } + case 'artifacts.delete': { + contract.output.parse(value) + return 'Artifact deleted' + } + case 'sessions.runDetached': { + const result = contract.output.parse(value) + return [ + `Run ${result.runId} started (${result.status})`, + `Session: ${result.sessionId}`, + `Watch: deepchat run watch --run ${result.runId}` + ].join('\n') + } + case 'runs.get': { + const result = contract.output.parse(value) + return [ + `Run ${result.runId} (${result.status})`, + `Agent: ${result.agentId}`, + `Model: ${result.providerId}/${result.modelId}`, + ...result.messages.flatMap((message) => [ + '', + `[${message.role}]${message.textTruncated ? ' (truncated)' : ''}`, + message.text + ]), + ...(result.nextCursor ? ['', `Next cursor: ${JSON.stringify(result.nextCursor)}`] : []) + ].join('\n') + } + case 'runs.cancel': { + const result = contract.output.parse(value) + return result.cancelRequested + ? `Cancellation requested for ${result.runId} (${result.status})` + : `Run ${result.runId} was already ${result.status}` + } + case 'events.subscribe': { + const result = contract.output.parse(value) + return `Run ${result.runId} stream ended at ${result.lastCursor}` + } + case 'providers.listPublic': { + const result = contract.output.parse(value) + return result.providers + .flatMap((provider) => [ + `${provider.id} ${provider.enabled ? 'enabled' : 'disabled'} ${provider.storedCredentialConfigured ? 'credential-stored' : 'no-stored-credential'} ${provider.name}`, + ...provider.models.map( + (model) => + ` ${model.id} ${model.enabled ? 'enabled' : 'disabled'} ${model.type ?? 'chat'}` + ) + ]) + .join('\n') + } + case 'providers.testPublicConnection': { + const result = contract.output.parse(value) + return result.isOk + ? 'Provider connection succeeded' + : `Provider connection failed: ${result.errorMsg}` + } + case 'providers.addPublic': + case 'providers.updatePublic': { + const result = contract.output.parse(value) + return `${result.provider.id} ${result.provider.enabled ? 'enabled' : 'disabled'} ${result.provider.name}` + } + case 'providers.setCredential': { + const result = contract.output.parse(value) + return result.action === 'set' + ? `Stored ${result.kind} credential for ${result.providerId}` + : `Cleared ${result.kind} credential for ${result.providerId}` + } + case 'providers.remove': { + const result = contract.output.parse(value) + return result.removed ? 'Provider removed' : 'Provider was not found' + } + case 'models.listRuntime': { + const result = contract.output.parse(value) + return result.models + .map((model) => `${model.id} ${model.enabled ? 'enabled' : 'disabled'} ${model.name}`) + .join('\n') + } + case 'models.getPublicConfig': + case 'models.setPublicConfig': { + return JSON.stringify(contract.output.parse(value).config, null, 2) + } + case 'models.setStatus': { + const result = contract.output.parse(value) + return `${result.modelId} ${result.enabled ? 'enabled' : 'disabled'}` + } + case 'models.resetConfig': { + contract.output.parse(value) + return 'Model configuration reset' + } + case 'settings.getPublic': { + const result = contract.output.parse(value) + return Object.entries(result.values) + .map(([key, setting]) => `${key} = ${JSON.stringify(setting)}`) + .join('\n') + } + case 'settings.updatePublic': { + const result = contract.output.parse(value) + return result.changedKeys + .map((key) => `${key} = ${JSON.stringify(result.values[key])}`) + .join('\n') + } + case 'skills.listPublic': { + const result = contract.output.parse(value) + return [ + ...result.skills.map( + (skill) => + `${skill.name} ${skill.enabled ? 'enabled' : 'disabled'} ${skill.managedBy} ${skill.sourceType}${skill.metadataTruncated ? ' metadata-truncated' : ''} ${skill.description}` + ), + ...(result.truncated ? ['Skill list truncated; use --agent to narrow the scope'] : []) + ].join('\n') + } + case 'skills.installPublicUrl': + case 'skills.installUpload': { + const result = contract.output.parse(value) + return `${result.name} installed for ${result.agentId}` + } + case 'skills.setPublicStatus': { + const result = contract.output.parse(value) + return `${result.name} ${result.enabled ? 'enabled' : 'disabled'} for ${result.agentId}` + } + case 'skills.uninstallPublic': { + const result = contract.output.parse(value) + return `${result.name} removed from ${result.agentId}` + } + case 'mcp.listPublic': { + const result = contract.output.parse(value) + return [ + ...result.servers.map( + (server) => + `${server.name} ${server.type} ${server.enabled ? 'enabled' : 'disabled'} ${server.running === null ? 'runtime-unknown' : server.running ? 'running' : 'stopped'} ${server.managedBy}${server.metadataTruncated ? ' metadata-truncated' : ''} ${server.description}` + ), + ...(result.truncated ? ['MCP server list truncated'] : []) + ].join('\n') + } + case 'mcp.addPublic': { + const result = contract.output.parse(value) + return `${result.server.name} added; ${result.server.enabled ? 'enabled' : 'disabled'}; runtime ${formatMcpRuntime(result.server.running)}` + } + case 'mcp.updatePublic': { + const result = contract.output.parse(value) + return `${result.server.name} updated; runtime ${formatMcpRuntime(result.server.running)}` + } + case 'mcp.removePublic': { + const result = contract.output.parse(value) + return `${result.serverName} removed` + } + case 'mcp.setPublicStatus': { + const result = contract.output.parse(value) + return `${result.server.name} ${result.server.enabled ? 'enabled' : 'disabled'}; runtime ${formatMcpRuntime(result.server.running)}` + } + case 'mcp.startPublic': { + const result = contract.output.parse(value) + return `${result.server.name} start requested; runtime ${formatMcpRuntime(result.server.running)}` + } + case 'mcp.stopPublic': { + const result = contract.output.parse(value) + return `${result.server.name} stop requested; runtime ${formatMcpRuntime(result.server.running)}` + } + case 'models.invoke': { + return contract.output.parse(value).text + } + case 'audio.transcribeUpload': + case 'audio.transcribeArtifact': { + return contract.output.parse(value).text + } + case 'ocr.getRuntimeStatus': { + const result = contract.output.parse(value) + const availability = + result.availability.status === 'available' + ? `available (${result.availability.lightOcrVersion})` + : `unavailable (${result.availability.reason})` + return [ + `OCR: ${availability}`, + `Platform: ${result.platform}/${result.arch}`, + `Runtime: ${result.process?.state ?? 'not started'}`, + `Cache: ${result.cache ? `${result.cache.entryCount} entries, ${result.cache.logicalBytes} bytes` : 'not initialized'}` + ].join('\n') + } + case 'ocr.extractUpload': + case 'ocr.extractArtifact': { + return contract.output.parse(value).text + } + case 'ocr.clearCache': { + const result = contract.output.parse(value) + return `OCR cache cleared (${result.cache.entryCount} entries, ${result.cache.logicalBytes} bytes)` + } + case 'images.generate': + case 'videos.generate': + case 'speech.generate': { + const result = contract.output.parse(value) + const noun = + contract.name === 'images.generate' + ? 'image' + : contract.name === 'videos.generate' + ? 'video' + : 'audio' + return [ + `Generated ${result.artifacts.length} ${noun} artifact${result.artifacts.length === 1 ? '' : 's'} in ${formatDuration(result.durationMs)}`, + ...result.artifacts.flatMap((artifact) => [ + `${artifact.id} ${artifact.mimeType} ${artifact.size} bytes ${artifact.filename}`, + ` Download: deepchat artifact get --id ${artifact.id} --out ${artifact.filename}` + ]) + ].join('\n') + } + default: + return unsupportedCliContract(contract) + } +} + +export function serializeMachineResponse(response: LocalControlRpcResponse): string { + return `${JSON.stringify(response)}\n` +} diff --git a/src/cli/globals.d.ts b/src/cli/globals.d.ts new file mode 100644 index 0000000000..d1fb96be11 --- /dev/null +++ b/src/cli/globals.d.ts @@ -0,0 +1 @@ +declare const __DEEPCHAT_CLI_VERSION__: string diff --git a/src/cli/index.ts b/src/cli/index.ts new file mode 100644 index 0000000000..7a31193b63 --- /dev/null +++ b/src/cli/index.ts @@ -0,0 +1,38 @@ +import { realpathSync } from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { runCli } from './run' + +export { parseCliArguments, formatCliHelp } from './args' +export { downloadArtifact } from './artifacts' +export { readBoundedUtf8Stdin } from './stdin' +export { loadLocalControlDescriptor, resolveCliUserDataPath } from './discovery' +export { CLI_EXIT_CODES } from './errors' +export { runCli } from './run' +export { CLI_VERSION, invokeLocalControlRpc, invokeLocalControlStream } from './transport' + +function exitOnStreamError(stream: NodeJS.WriteStream): void { + stream.on('error', (error: NodeJS.ErrnoException) => { + if (error.code === 'EPIPE') process.exit(0) + process.exit(8) + }) +} + +function isDirectExecution(): boolean { + if (!process.argv[1]) return false + try { + return ( + realpathSync(path.resolve(process.argv[1])) === realpathSync(fileURLToPath(import.meta.url)) + ) + } catch { + return false + } +} + +if (isDirectExecution()) { + exitOnStreamError(process.stdout) + exitOnStreamError(process.stderr) + void runCli(process.argv.slice(2)).then((exitCode) => { + process.exitCode = exitCode + }) +} diff --git a/src/cli/run.ts b/src/cli/run.ts new file mode 100644 index 0000000000..33787551dc --- /dev/null +++ b/src/cli/run.ts @@ -0,0 +1,507 @@ +import { randomUUID } from 'node:crypto' +import { JsonValueSchema, type JsonValue } from '@shared/contracts/json' +import { getDeepchatEventContract, RunStreamEventNameSchema } from '@shared/contracts/events' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + createLocalControlFailure, + type LocalControlDescriptor, + type LocalControlRpcResponse +} from '@shared/contracts/localControl' +import { artifactsDescribeRoute } from '@shared/contracts/routes/artifacts.routes' +import { MediaGenerationEventSchema } from '@shared/contracts/routes/media.routes' +import { ModelInvokeEventSchema } from '@shared/contracts/routes/models.routes' +import { PUBLIC_MCP_CONFIG_MAX_BYTES } from '@shared/contracts/routes/mcp.routes' +import { PROVIDER_CREDENTIAL_MAX_BYTES } from '@shared/contracts/routes/providers.routes' +import { + RUN_PROMPT_MAX_CHARACTERS, + sessionsRunDetachedRoute +} from '@shared/contracts/routes/runs.routes' +import { parseCliArguments, formatCliHelp, inferCliOutputMode, type CliOutputMode } from './args' +import { + loadLocalControlDescriptor, + selectLocalControlToken, + type CliDiscoveryOptions +} from './discovery' +import { + CLI_EXIT_CODES, + CliClientError, + CliUsageError, + exitCodeForRemoteError, + type CliExitCode +} from './errors' +import { formatHumanResult, serializeMachineResponse } from './format' +import { + invokeLocalControlRpc, + invokeLocalControlStream, + invokeLocalControlUpload, + type CliRpcInvocation, + type CliStreamEventHandler, + type CliUploadInvocation +} from './transport' +import { downloadArtifact } from './artifacts' +import { readBoundedUtf8Stdin } from './stdin' + +const SIGNAL_GRACE_MS = 1_000 + +type WritableOutput = Pick +type SignalHost = Pick + +export type CliRunDependencies = Readonly<{ + env?: NodeJS.ProcessEnv + discovery?: Omit + stdout?: WritableOutput + stderr?: WritableOutput + stdin?: NodeJS.ReadableStream + signalHost?: SignalHost + randomId?: () => string + loadDescriptor?: (options: CliDiscoveryOptions) => Promise + invokeRpc?: (invocation: CliRpcInvocation) => Promise + invokeStream?: ( + invocation: CliRpcInvocation, + onEvent: CliStreamEventHandler + ) => Promise + invokeUpload?: (invocation: CliUploadInvocation) => Promise + forceExit?: (code: number) => void +}> + +function writeText(output: WritableOutput, value: string): void { + output.write(value.endsWith('\n') ? value : `${value}\n`) +} + +function sanitizeTerminalText(value: string): string { + const output: string[] = [] + let start = 0 + let offset = 0 + for (const character of value) { + const codePoint = character.codePointAt(0) ?? 0 + const isUnsafeControl = + codePoint === 0x0d || + (codePoint <= 0x1f && codePoint !== 0x09 && codePoint !== 0x0a) || + (codePoint >= 0x7f && codePoint <= 0x9f) + const isBidiControl = + codePoint === 0x061c || + codePoint === 0x200e || + codePoint === 0x200f || + (codePoint >= 0x202a && codePoint <= 0x202e) || + (codePoint >= 0x2066 && codePoint <= 0x2069) + if (isUnsafeControl || isBidiControl) { + if (offset > start) output.push(value.slice(start, offset)) + start = offset + character.length + } + offset += character.length + } + if (start === 0) return value + if (start < value.length) output.push(value.slice(start)) + return output.join('') +} + +function writeHumanText(output: WritableOutput, value: string): void { + writeText(output, sanitizeTerminalText(value)) +} + +function runEventPayloadMatchesTarget( + event: Parameters[0], + data: JsonValue, + expectedRunId: string | undefined +): boolean { + if (!event.event.startsWith('runs.')) return true + if (!data || typeof data !== 'object' || Array.isArray(data)) return false + if (event.event === 'runs.snapshot') { + const run = data.run + if (!run || typeof run !== 'object' || Array.isArray(run)) return false + return data.cursor === event.cursor && run.runId === expectedRunId + } + return data.runId === expectedRunId +} + +function parseStdinJsonObject(input: string, label: string): Record { + let candidate: unknown + try { + candidate = JSON.parse(input) as unknown + } catch { + throw new CliClientError( + 'invalid_request', + `${label} stdin must be valid JSON`, + CLI_EXIT_CODES.usage + ) + } + const parsed = JsonValueSchema.safeParse(candidate) + if ( + !parsed.success || + !parsed.data || + typeof parsed.data !== 'object' || + Array.isArray(parsed.data) + ) { + throw new CliClientError( + 'invalid_request', + `${label} stdin must be a JSON object`, + CLI_EXIT_CODES.usage + ) + } + return parsed.data +} + +function writeClientError( + error: CliClientError, + outputMode: CliOutputMode, + requestId: string, + stdout: WritableOutput, + stderr: WritableOutput +): void { + if (outputMode === 'text') { + writeHumanText(stderr, `${error.code}: ${error.message}`) + return + } + writeText( + stdout, + serializeMachineResponse( + createLocalControlFailure(requestId, { + code: error.code, + message: error.message, + retriable: error.retriable + }) + ) + ) +} + +function parseStreamEventData( + method: string, + event: Parameters[0], + expectedRunId?: string +): JsonValue { + const runEventName = + method === 'events.subscribe' ? RunStreamEventNameSchema.safeParse(event.event) : null + const parsed = + method === 'events.subscribe' + ? event.runId === expectedRunId && typeof event.cursor === 'string' && runEventName?.success + ? getDeepchatEventContract(runEventName.data).payload.safeParse(event.data) + : null + : event.event !== method + ? null + : method === 'models.invoke' + ? ModelInvokeEventSchema.safeParse(event.data) + : method === 'images.generate' || + method === 'videos.generate' || + method === 'speech.generate' + ? MediaGenerationEventSchema.safeParse(event.data) + : null + if (!parsed?.success) { + throw new CliClientError( + 'internal_error', + 'DeepChat emitted an invalid stream event', + CLI_EXIT_CODES.internal + ) + } + const data = JsonValueSchema.safeParse(parsed.data) + if (!data.success) { + throw new CliClientError( + 'internal_error', + 'DeepChat emitted a non-JSON stream event', + CLI_EXIT_CODES.internal + ) + } + if ( + method === 'events.subscribe' && + !runEventPayloadMatchesTarget(event, data.data, expectedRunId) + ) { + throw new CliClientError( + 'internal_error', + 'DeepChat emitted an event for another run', + CLI_EXIT_CODES.internal + ) + } + return data.data +} + +export async function runCli( + argv: readonly string[], + dependencies: CliRunDependencies = {} +): Promise { + const env = dependencies.env ?? process.env + const stdout = dependencies.stdout ?? process.stdout + const stderr = dependencies.stderr ?? process.stderr + const stdin = dependencies.stdin ?? process.stdin + const signalHost = dependencies.signalHost ?? process + const requestId = (dependencies.randomId ?? randomUUID)() + + let parsed + try { + parsed = parseCliArguments(argv, env) + } catch (error) { + const message = error instanceof CliUsageError ? error.message : 'Invalid CLI arguments' + const outputMode = inferCliOutputMode(argv, env) + if (outputMode === 'text') { + writeHumanText(stderr, message) + writeHumanText(stderr, 'Run: deepchat help') + } else { + writeClientError( + new CliClientError('invalid_request', message, CLI_EXIT_CODES.usage), + outputMode, + requestId, + stdout, + stderr + ) + } + return CLI_EXIT_CODES.usage + } + + if (parsed.helpRequested) { + writeText(stdout, formatCliHelp(parsed)) + return CLI_EXIT_CODES.success + } + if (!parsed.contract) { + writeText(stderr, 'CLI command is not implemented') + return CLI_EXIT_CODES.internal + } + + const controller = new AbortController() + let forcedExitTimer: NodeJS.Timeout | undefined + let timeout: NodeJS.Timeout | undefined + let signalCount = 0 + const forceExit = dependencies.forceExit ?? ((code: number) => process.exit(code)) + const abortWith = (error: CliClientError) => { + if (!controller.signal.aborted) controller.abort(error) + } + const onSignal = () => { + signalCount += 1 + if (signalCount > 1) { + forceExit(CLI_EXIT_CODES.cancelled) + return + } + abortWith( + new CliClientError('cancelled', 'CLI request was interrupted', CLI_EXIT_CODES.cancelled) + ) + forcedExitTimer = setTimeout(() => forceExit(CLI_EXIT_CODES.cancelled), SIGNAL_GRACE_MS) + } + + signalHost.on('SIGINT', onSignal) + signalHost.on('SIGTERM', onSignal) + timeout = setTimeout(() => { + abortWith( + new CliClientError('timeout', 'CLI request timed out', CLI_EXIT_CODES.cancelled, true) + ) + }, parsed.timeoutMs) + + try { + let params = parsed.params + if (parsed.readStdin) { + const input = await readBoundedUtf8Stdin( + stdin, + controller.signal, + parsed.contract.name === 'providers.setCredential' + ? PROVIDER_CREDENTIAL_MAX_BYTES + : parsed.contract.name === sessionsRunDetachedRoute.name + ? RUN_PROMPT_MAX_CHARACTERS * 4 + : parsed.contract.name === 'mcp.addPublic' || + parsed.contract.name === 'mcp.updatePublic' + ? PUBLIC_MCP_CONFIG_MAX_BYTES + : undefined + ) + if (!params || typeof params !== 'object' || Array.isArray(params)) { + throw new CliClientError( + 'internal_error', + 'CLI command has invalid input parameters', + CLI_EXIT_CODES.internal + ) + } + switch (parsed.contract.name) { + case 'models.invoke': { + const messages = Array.isArray(params.messages) ? params.messages : [] + params = { ...params, messages: [...messages, { role: 'user', content: input }] } + break + } + case 'images.generate': + case 'videos.generate': + params = { ...params, prompt: input } + break + case 'speech.generate': + params = { ...params, text: input } + break + case 'sessions.runDetached': + params = { ...params, prompt: input } + break + case 'providers.setCredential': + params = { ...params, value: input.replace(/(?:\r\n|\n)$/, '') } + break + case 'models.setPublicConfig': { + params = { ...params, config: parseStdinJsonObject(input, 'Model configuration') } + break + } + case 'mcp.addPublic': { + params = { ...params, config: parseStdinJsonObject(input, 'MCP configuration') } + break + } + case 'mcp.updatePublic': { + params = { ...params, updates: parseStdinJsonObject(input, 'MCP update') } + break + } + default: + throw new CliClientError( + 'internal_error', + 'CLI command does not accept standard input', + CLI_EXIT_CODES.internal + ) + } + } + const validatedInput = parsed.contract.input.safeParse(params) + if (!validatedInput.success) { + throw new CliClientError( + 'invalid_request', + 'CLI input does not match the command contract', + CLI_EXIT_CODES.usage + ) + } + const descriptor = await (dependencies.loadDescriptor ?? loadLocalControlDescriptor)({ + ...dependencies.discovery, + env + }) + if (controller.signal.aborted) throw controller.signal.reason + const token = selectLocalControlToken(descriptor, env) + if ( + parsed.operation === 'download' && + Object.prototype.hasOwnProperty.call(env, LOCAL_CONTROL_AGENT_TOKEN_ENV) + ) { + throw new CliClientError( + 'permission_denied', + 'Agent callers cannot download artifact bytes or use --out', + CLI_EXIT_CODES.authorization + ) + } + if ( + parsed.operation === 'upload' && + Object.prototype.hasOwnProperty.call(env, LOCAL_CONTROL_AGENT_TOKEN_ENV) + ) { + throw new CliClientError( + 'permission_denied', + 'Agent callers cannot upload local file bytes or use --file', + CLI_EXIT_CODES.authorization + ) + } + const invocationContract = + parsed.operation === 'download' ? artifactsDescribeRoute : parsed.contract + const invocation: CliRpcInvocation = { + descriptor, + token, + id: requestId, + method: invocationContract.name, + params: validatedInput.data, + signal: controller.signal + } + let streamedText = false + let streamedTextEndsWithNewline = false + const contractName = parsed.contract.name + const expectedRunId = + contractName === 'events.subscribe' && + validatedInput.data && + typeof validatedInput.data === 'object' && + 'runId' in validatedInput.data && + typeof validatedInput.data.runId === 'string' + ? validatedInput.data.runId + : undefined + const onStreamEvent: CliStreamEventHandler = async (event) => { + const canonicalData = parseStreamEventData(contractName, event, expectedRunId) + if (parsed.outputMode === 'jsonl') { + writeText(stdout, JSON.stringify({ ...event, data: canonicalData })) + return + } + if (parsed.outputMode !== 'text' || contractName !== 'models.invoke') return + const parsedEvent = ModelInvokeEventSchema.parse(canonicalData) + if (parsedEvent.type === 'text_delta' && parsedEvent.text) { + const safeText = sanitizeTerminalText(parsedEvent.text) + if (!safeText) return + stdout.write(safeText) + streamedText = true + streamedTextEndsWithNewline = safeText.endsWith('\n') + } + } + let response: LocalControlRpcResponse + if (parsed.operation === 'stream') { + response = await (dependencies.invokeStream ?? invokeLocalControlStream)( + invocation, + onStreamEvent + ) + } else if (parsed.operation === 'upload') { + if (!parsed.inputPath || !parsed.uploadMaxBytes) { + throw new CliClientError( + 'internal_error', + 'Upload command has no validated input source', + CLI_EXIT_CODES.internal + ) + } + response = await (dependencies.invokeUpload ?? invokeLocalControlUpload)({ + ...invocation, + filePath: parsed.inputPath, + maxBytes: parsed.uploadMaxBytes + }) + } else { + response = await (dependencies.invokeRpc ?? invokeLocalControlRpc)(invocation) + } + + if (!response.ok) { + if (streamedText && !streamedTextEndsWithNewline) stdout.write('\n') + if (parsed.outputMode === 'text') { + writeHumanText(stderr, `${response.error.code}: ${response.error.message}`) + } else { + writeText(stdout, serializeMachineResponse(response)) + } + return exitCodeForRemoteError(response.error) + } + + const result = parsed.contract.output.safeParse(response.result) + if (!result.success) { + throw new CliClientError( + 'internal_error', + 'DeepChat result did not match the command contract', + CLI_EXIT_CODES.internal + ) + } + if (parsed.operation === 'download') { + if (!parsed.outputPath || !('artifact' in result.data)) { + throw new CliClientError( + 'internal_error', + 'Artifact download command has no validated output target', + CLI_EXIT_CODES.internal + ) + } + await downloadArtifact({ + descriptor, + token, + metadata: result.data.artifact, + outputPath: parsed.outputPath, + overwrite: parsed.overwrite, + signal: controller.signal + }) + } + if ( + parsed.operation === 'stream' && + parsed.contract.name === 'models.invoke' && + parsed.outputMode === 'text' + ) { + if (!streamedText || !streamedTextEndsWithNewline) stdout.write('\n') + } else if (parsed.outputMode === 'text') { + writeHumanText( + stdout, + formatHumanResult(parsed.contract, response.result, { outputPath: parsed.outputPath }) + ) + } else { + writeText(stdout, serializeMachineResponse(response)) + } + return CLI_EXIT_CODES.success + } catch (error) { + const clientError = + error instanceof CliClientError + ? error + : new CliClientError( + 'internal_error', + error instanceof Error ? error.message : 'Unexpected CLI failure', + CLI_EXIT_CODES.internal + ) + writeClientError(clientError, parsed.outputMode, requestId, stdout, stderr) + return clientError.exitCode + } finally { + if (timeout) clearTimeout(timeout) + if (forcedExitTimer) clearTimeout(forcedExitTimer) + signalHost.off('SIGINT', onSignal) + signalHost.off('SIGTERM', onSignal) + } +} diff --git a/src/cli/stdin.ts b/src/cli/stdin.ts new file mode 100644 index 0000000000..11f5ccc775 --- /dev/null +++ b/src/cli/stdin.ts @@ -0,0 +1,59 @@ +import { CliClientError, CLI_EXIT_CODES } from './errors' + +export const MAX_CLI_STDIN_BYTES = 4 * 1024 * 1024 + +function abortReason(signal: AbortSignal): Error { + return signal.reason instanceof Error + ? signal.reason + : new CliClientError('cancelled', 'CLI input was cancelled', CLI_EXIT_CODES.cancelled) +} + +export async function readBoundedUtf8Stdin( + stream: NodeJS.ReadableStream, + signal: AbortSignal, + maxBytes = MAX_CLI_STDIN_BYTES +): Promise { + if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) { + throw new Error('Invalid CLI stdin byte limit') + } + if (signal.aborted) throw abortReason(signal) + + const chunks: Buffer[] = [] + let size = 0 + const destroy = (error: Error) => { + const destroyable = stream as NodeJS.ReadableStream & { destroy?: (error?: Error) => void } + destroyable.destroy?.(error) + } + const onAbort = () => destroy(abortReason(signal)) + signal.addEventListener('abort', onAbort, { once: true }) + try { + for await (const rawChunk of stream as AsyncIterable) { + if (signal.aborted) throw abortReason(signal) + const chunk = Buffer.from(rawChunk) + size += chunk.length + if (size > maxBytes) { + throw new CliClientError( + 'body_too_large', + 'Standard input exceeds the CLI byte limit', + CLI_EXIT_CODES.usage + ) + } + chunks.push(chunk) + } + } catch (error) { + if (signal.aborted) throw abortReason(signal) + throw error + } finally { + signal.removeEventListener('abort', onAbort) + } + + try { + return new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks, size)) + } catch { + throw new CliClientError( + 'invalid_request', + 'Standard input is not valid UTF-8', + CLI_EXIT_CODES.usage + ) + } +} diff --git a/src/cli/transport.ts b/src/cli/transport.ts new file mode 100644 index 0000000000..a7741f9773 --- /dev/null +++ b/src/cli/transport.ts @@ -0,0 +1,587 @@ +import { createHash } from 'node:crypto' +import { constants as fsConstants } from 'node:fs' +import { lstat, open } from 'node:fs/promises' +import { request as httpRequest, type IncomingHttpHeaders, type IncomingMessage } from 'node:http' +import { + LOCAL_CONTROL_RPC_PATH, + LOCAL_CONTROL_STREAM_PATH, + LOCAL_CONTROL_UPLOAD_PATH, + LOCAL_CONTROL_METHOD_HEADER, + LOCAL_CONTROL_UPLOAD_REQUEST_HEADER, + LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES, + LOCAL_CONTROL_MAX_STREAM_RECORD_BYTES, + LOCAL_CONTROL_MAX_UPLOAD_REQUEST_HEADER_BYTES, + LocalControlEventEnvelopeSchema, + LocalControlRpcRequestSchema, + LocalControlRpcResponseSchema, + LocalControlStreamRecordSchema, + LocalControlUploadRequestSchema, + type LocalControlDescriptor, + type LocalControlEventEnvelope, + type LocalControlRpcResponse, + type LocalControlUploadBinding +} from '@shared/contracts/localControl' +import type { JsonValue } from '@shared/contracts/json' +import { CLI_EXIT_CODES, CliClientError } from './errors' + +export const CLI_VERSION = + typeof __DEEPCHAT_CLI_VERSION__ === 'string' ? __DEEPCHAT_CLI_VERSION__ : 'development' + +export type CliRpcInvocation = Readonly<{ + descriptor: LocalControlDescriptor + token: string + id: string + method: string + params: JsonValue + signal: AbortSignal +}> + +export type CliUploadInvocation = CliRpcInvocation & + Readonly<{ + filePath: string + maxBytes: number + }> + +export type CliStreamEventHandler = (event: LocalControlEventEnvelope) => void | Promise + +function transportFailure(message: string, retriable = true): CliClientError { + return new CliClientError('unavailable', message, CLI_EXIT_CODES.unavailable, retriable) +} + +function protocolFailure(message: string): CliClientError { + return new CliClientError('internal_error', message, CLI_EXIT_CODES.internal) +} + +function declaredResponseLength( + headers: IncomingHttpHeaders, + distinctValues: readonly string[] | undefined +): number | null { + if (distinctValues && distinctValues.length !== 1) { + throw protocolFailure('DeepChat returned multiple Content-Length headers') + } + const raw = distinctValues?.[0] ?? headers['content-length'] + if (raw === undefined) return null + if (Array.isArray(raw) || !/^(0|[1-9][0-9]*)$/.test(raw)) { + throw protocolFailure('DeepChat returned an invalid Content-Length') + } + const length = Number(raw) + if (!Number.isSafeInteger(length) || length > LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES) { + throw protocolFailure('DeepChat response exceeds the CLI byte limit') + } + return length +} + +function abortReason(signal: AbortSignal): Error { + return signal.reason instanceof Error + ? signal.reason + : new CliClientError('cancelled', 'CLI request was cancelled', CLI_EXIT_CODES.cancelled) +} + +function createInvocationBody(invocation: CliRpcInvocation): Buffer { + return Buffer.from( + JSON.stringify( + LocalControlRpcRequestSchema.parse({ + protocolVersion: invocation.descriptor.protocolVersion, + surfaceVersion: invocation.descriptor.surfaceVersion, + id: invocation.id, + method: invocation.method, + params: invocation.params + }) + ), + 'utf8' + ) +} + +function createUploadInvocationHeader( + invocation: CliRpcInvocation, + upload: LocalControlUploadBinding +): string { + return Buffer.from( + JSON.stringify( + LocalControlUploadRequestSchema.parse({ + protocolVersion: invocation.descriptor.protocolVersion, + surfaceVersion: invocation.descriptor.surfaceVersion, + id: invocation.id, + method: invocation.method, + params: invocation.params, + upload + }) + ), + 'utf8' + ).toString('base64url') +} + +async function readJsonResponse( + response: IncomingMessage, + expectedRequestId: string, + signal: AbortSignal +): Promise { + try { + const contentTypes = response.headersDistinct['content-type'] + const contentType = contentTypes?.[0] ?? response.headers['content-type'] + const [mediaType, ...parameters] = + typeof contentType === 'string' + ? contentType.split(';').map((part) => part.trim().toLowerCase()) + : [] + if ( + (contentTypes && contentTypes.length !== 1) || + mediaType !== 'application/json' || + !parameters.every((parameter) => parameter === 'charset=utf-8') + ) { + throw protocolFailure('DeepChat returned a non-JSON response') + } + if (response.headers['content-encoding'] !== undefined) { + throw protocolFailure('Compressed local responses are not supported') + } + + const expectedLength = declaredResponseLength( + response.headers, + response.headersDistinct['content-length'] + ) + const chunks: Buffer[] = [] + let size = 0 + for await (const rawChunk of response) { + const chunk = Buffer.from(rawChunk) + size += chunk.length + if (size > LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES) { + throw protocolFailure('DeepChat response exceeds the CLI byte limit') + } + chunks.push(chunk) + } + if (expectedLength !== null && expectedLength !== size) { + throw protocolFailure('DeepChat response length did not match') + } + + let parsed: LocalControlRpcResponse + try { + parsed = LocalControlRpcResponseSchema.parse( + JSON.parse(Buffer.concat(chunks, size).toString('utf8')) + ) + } catch { + throw protocolFailure('DeepChat returned an invalid response envelope') + } + const isHttpSuccess = (response.statusCode ?? 0) >= 200 && (response.statusCode ?? 0) < 300 + if (parsed.ok !== isHttpSuccess) { + throw protocolFailure('DeepChat HTTP status and response envelope disagree') + } + if (parsed.id !== expectedRequestId && !(!parsed.ok && parsed.id === 'unknown')) { + throw protocolFailure('DeepChat response ID did not match the request') + } + return parsed + } catch (error) { + if (!response.destroyed) response.destroy() + if (signal.aborted) throw abortReason(signal) + if (error instanceof CliClientError) throw error + throw transportFailure(error instanceof Error ? error.message : 'Local response failed') + } +} + +export async function invokeLocalControlRpc( + invocation: CliRpcInvocation +): Promise { + if (invocation.signal.aborted) throw abortReason(invocation.signal) + const body = createInvocationBody(invocation) + + return await new Promise((resolve, reject) => { + let settled = false + const finish = (callback: () => void) => { + if (settled) return + settled = true + callback() + } + const request = httpRequest({ + socketPath: + invocation.descriptor.endpoint.kind === 'unix' + ? invocation.descriptor.endpoint.path + : invocation.descriptor.endpoint.name, + path: LOCAL_CONTROL_RPC_PATH, + method: 'POST', + agent: false, + signal: invocation.signal, + headers: { + authorization: `Bearer ${invocation.token}`, + 'content-type': 'application/json', + 'content-length': body.length, + [LOCAL_CONTROL_METHOD_HEADER]: invocation.method, + connection: 'close', + 'user-agent': `DeepChat-CLI/${CLI_VERSION}` + } + }) + + request.once('response', (response) => { + void readJsonResponse(response, invocation.id, invocation.signal).then( + (result) => finish(() => resolve(result)), + (error: unknown) => finish(() => reject(error)) + ) + }) + request.once('error', (error: NodeJS.ErrnoException) => { + if (invocation.signal.aborted) { + finish(() => reject(abortReason(invocation.signal))) + return + } + const message = + error.code === 'ENOENT' || error.code === 'ECONNREFUSED' || error.code === 'EPIPE' + ? 'DeepChat local control server is unavailable' + : `Cannot connect to DeepChat: ${error.message}` + finish(() => reject(transportFailure(message))) + }) + request.end(body) + }) +} + +function uploadFileError(message: string, code: 'invalid_request' | 'body_too_large') { + return new CliClientError( + code, + message, + code === 'invalid_request' ? CLI_EXIT_CODES.usage : CLI_EXIT_CODES.domain + ) +} + +async function hashUploadFile( + handle: Awaited>, + size: number, + signal: AbortSignal +): Promise { + try { + const hash = createHash('sha256') + const buffer = Buffer.allocUnsafe(Math.min(size, 256 * 1024)) + let position = 0 + while (position < size) { + if (signal.aborted) throw abortReason(signal) + const length = Math.min(buffer.length, size - position) + const { bytesRead } = await handle.read(buffer, 0, length, position) + if (bytesRead === 0) { + throw uploadFileError('Upload source changed while it was being read', 'invalid_request') + } + hash.update(buffer.subarray(0, bytesRead)) + position += bytesRead + } + return hash.digest('hex') + } catch (error) { + if (signal.aborted) throw abortReason(signal) + if (error instanceof CliClientError) throw error + throw uploadFileError('Upload source could not be read', 'invalid_request') + } +} + +export async function invokeLocalControlUpload( + invocation: CliUploadInvocation +): Promise { + if (invocation.signal.aborted) throw abortReason(invocation.signal) + if (!Number.isSafeInteger(invocation.maxBytes) || invocation.maxBytes <= 0) { + throw protocolFailure('CLI upload limit is invalid') + } + + let pathStat + try { + pathStat = await lstat(invocation.filePath) + } catch { + throw uploadFileError('Upload source is unavailable', 'invalid_request') + } + if (!pathStat.isFile() || pathStat.isSymbolicLink()) { + throw uploadFileError('Upload source must be a regular non-symlink file', 'invalid_request') + } + if (pathStat.size <= 0) { + throw uploadFileError('Upload source is empty', 'invalid_request') + } + if (!Number.isSafeInteger(pathStat.size) || pathStat.size > invocation.maxBytes) { + throw uploadFileError('Upload source exceeds the command byte limit', 'body_too_large') + } + + const openFlags = + process.platform === 'win32' + ? fsConstants.O_RDONLY + : fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW + let handle + try { + handle = await open(invocation.filePath, openFlags) + } catch { + throw uploadFileError('Upload source could not be opened safely', 'invalid_request') + } + + try { + const openedStat = await handle.stat() + if ( + !openedStat.isFile() || + openedStat.size !== pathStat.size || + openedStat.dev !== pathStat.dev || + openedStat.ino !== pathStat.ino + ) { + throw uploadFileError('Upload source changed before it could be read', 'invalid_request') + } + + const sha256 = await hashUploadFile(handle, openedStat.size, invocation.signal) + const hashedStat = await handle.stat() + if ( + !hashedStat.isFile() || + hashedStat.size !== openedStat.size || + hashedStat.dev !== openedStat.dev || + hashedStat.ino !== openedStat.ino + ) { + throw uploadFileError('Upload source changed while it was being read', 'invalid_request') + } + const envelope = createUploadInvocationHeader(invocation, { + size: openedStat.size, + sha256 + }) + if (Buffer.byteLength(envelope, 'ascii') > LOCAL_CONTROL_MAX_UPLOAD_REQUEST_HEADER_BYTES) { + throw uploadFileError('Upload metadata exceeds the CLI byte limit', 'invalid_request') + } + + const uploadStream = handle.createReadStream({ + autoClose: false, + start: 0, + end: openedStat.size - 1, + signal: invocation.signal + }) + try { + return await new Promise((resolve, reject) => { + let settled = false + let responseReceived = false + const finish = (callback: () => void) => { + if (settled) return + settled = true + callback() + } + const request = httpRequest({ + socketPath: + invocation.descriptor.endpoint.kind === 'unix' + ? invocation.descriptor.endpoint.path + : invocation.descriptor.endpoint.name, + path: LOCAL_CONTROL_UPLOAD_PATH, + method: 'POST', + agent: false, + signal: invocation.signal, + headers: { + authorization: `Bearer ${invocation.token}`, + 'content-type': 'application/octet-stream', + 'content-length': openedStat.size, + expect: '100-continue', + [LOCAL_CONTROL_UPLOAD_REQUEST_HEADER]: envelope, + connection: 'close', + 'user-agent': `DeepChat-CLI/${CLI_VERSION}` + } + }) + + request.once('response', (response) => { + responseReceived = true + void readJsonResponse(response, invocation.id, invocation.signal).then( + (result) => finish(() => resolve(result)), + (error: unknown) => finish(() => reject(error)) + ) + }) + request.once('error', (error: NodeJS.ErrnoException) => { + if (responseReceived) return + if (invocation.signal.aborted) { + finish(() => reject(abortReason(invocation.signal))) + return + } + const message = + error.code === 'ENOENT' || error.code === 'ECONNREFUSED' || error.code === 'EPIPE' + ? 'DeepChat local control server is unavailable' + : `Cannot connect to DeepChat: ${error.message}` + finish(() => reject(transportFailure(message))) + }) + uploadStream.once('error', (error) => { + if (responseReceived) return + request.destroy(error) + if (!invocation.signal.aborted) { + finish(() => reject(transportFailure('Upload source could not be read'))) + } + }) + request.once('continue', () => uploadStream.pipe(request)) + request.flushHeaders() + }) + } finally { + uploadStream.destroy() + } + } finally { + await handle.close().catch(() => undefined) + } +} + +export async function invokeLocalControlStream( + invocation: CliRpcInvocation, + onEvent: CliStreamEventHandler +): Promise { + if (invocation.signal.aborted) throw abortReason(invocation.signal) + const body = createInvocationBody(invocation) + + return await new Promise((resolve, reject) => { + let settled = false + let responseReceived = false + const finish = (callback: () => void) => { + if (settled) return + settled = true + callback() + } + const request = httpRequest({ + socketPath: + invocation.descriptor.endpoint.kind === 'unix' + ? invocation.descriptor.endpoint.path + : invocation.descriptor.endpoint.name, + path: LOCAL_CONTROL_STREAM_PATH, + method: 'POST', + agent: false, + signal: invocation.signal, + headers: { + authorization: `Bearer ${invocation.token}`, + 'content-type': 'application/json', + 'content-length': body.length, + [LOCAL_CONTROL_METHOD_HEADER]: invocation.method, + connection: 'close', + 'user-agent': `DeepChat-CLI/${CLI_VERSION}` + } + }) + + request.once('response', (response) => { + responseReceived = true + void (async () => { + const contentTypes = response.headersDistinct['content-type'] + const contentType = contentTypes?.[0] ?? response.headers['content-type'] + const [mediaType, ...parameters] = + typeof contentType === 'string' + ? contentType.split(';').map((part) => part.trim().toLowerCase()) + : [] + if (contentTypes && contentTypes.length !== 1) { + throw protocolFailure('DeepChat returned multiple Content-Type headers') + } + if (response.headers['content-encoding'] !== undefined) { + throw protocolFailure('Compressed local responses are not supported') + } + + const isHttpSuccess = (response.statusCode ?? 0) >= 200 && (response.statusCode ?? 0) < 300 + if (!isHttpSuccess) { + if ( + mediaType !== 'application/json' || + !parameters.every((parameter) => parameter === 'charset=utf-8') + ) { + throw protocolFailure('DeepChat returned a non-JSON error response') + } + const expectedLength = declaredResponseLength( + response.headers, + response.headersDistinct['content-length'] + ) + const chunks: Buffer[] = [] + let size = 0 + for await (const rawChunk of response) { + const chunk = Buffer.from(rawChunk) + size += chunk.length + if (size > LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES) { + throw protocolFailure('DeepChat response exceeds the CLI byte limit') + } + chunks.push(chunk) + } + if (expectedLength !== null && expectedLength !== size) { + throw protocolFailure('DeepChat response length did not match') + } + const parsed = LocalControlRpcResponseSchema.parse( + JSON.parse(Buffer.concat(chunks, size).toString('utf8')) + ) + if (parsed.ok) { + throw protocolFailure('DeepChat HTTP status and response envelope disagree') + } + if (parsed.id !== invocation.id && parsed.id !== 'unknown') { + throw protocolFailure('DeepChat response ID did not match the request') + } + return parsed + } + + if ( + mediaType !== 'application/x-ndjson' || + !parameters.every((parameter) => parameter === 'charset=utf-8') + ) { + throw protocolFailure('DeepChat returned a non-NDJSON stream') + } + + let pendingChunks: Buffer[] = [] + let pendingLength = 0 + let expectedSequence = 0 + let terminal: LocalControlRpcResponse | undefined + const consumeLine = async (line: Buffer): Promise => { + if (line.length === 0) throw protocolFailure('DeepChat returned an empty stream record') + let parsed + try { + parsed = LocalControlStreamRecordSchema.parse(JSON.parse(line.toString('utf8'))) + } catch { + throw protocolFailure('DeepChat returned an invalid stream record') + } + if ('ok' in parsed) { + if (terminal) throw protocolFailure('DeepChat returned multiple terminal records') + if (parsed.id !== invocation.id) { + throw protocolFailure('DeepChat stream result ID did not match the request') + } + terminal = parsed + return + } + if (terminal) + throw protocolFailure('DeepChat returned an event after the terminal record') + const event = LocalControlEventEnvelopeSchema.parse(parsed) + if (event.requestId !== invocation.id || event.sequence !== expectedSequence) { + throw protocolFailure('DeepChat stream event identity or order did not match') + } + expectedSequence += 1 + await onEvent(event) + } + + for await (const rawChunk of response) { + const chunk = Buffer.from(rawChunk) + let offset = 0 + while (offset < chunk.length) { + const newlineIndex = chunk.indexOf(0x0a, offset) + const end = newlineIndex >= 0 ? newlineIndex : chunk.length + if (end > offset) { + const segment = chunk.subarray(offset, end) + pendingChunks.push(segment) + pendingLength += segment.length + } + if (pendingLength > LOCAL_CONTROL_MAX_STREAM_RECORD_BYTES) { + throw protocolFailure('DeepChat stream record exceeds the CLI byte limit') + } + if (newlineIndex < 0) break + const line = + pendingChunks.length === 1 + ? pendingChunks[0] + : Buffer.concat(pendingChunks, pendingLength) + await consumeLine(line) + pendingChunks = [] + pendingLength = 0 + offset = newlineIndex + 1 + } + } + if (pendingLength !== 0) { + throw protocolFailure('DeepChat stream ended with an incomplete record') + } + if (!terminal) throw protocolFailure('DeepChat stream ended without a terminal record') + return terminal + })().then( + (result) => finish(() => resolve(result)), + (error: unknown) => { + response.destroy() + finish(() => + reject( + invocation.signal.aborted + ? abortReason(invocation.signal) + : error instanceof CliClientError + ? error + : protocolFailure('DeepChat stream transport failed') + ) + ) + } + ) + }) + request.once('error', (error: NodeJS.ErrnoException) => { + if (responseReceived) return + if (invocation.signal.aborted) { + finish(() => reject(abortReason(invocation.signal))) + return + } + const message = + error.code === 'ENOENT' || error.code === 'ECONNREFUSED' || error.code === 'EPIPE' + ? 'DeepChat local control server is unavailable' + : `Cannot connect to DeepChat: ${error.message}` + finish(() => reject(transportFailure(message))) + }) + request.end(body) + }) +} diff --git a/src/main/app/applicationDataReset.ts b/src/main/app/applicationDataReset.ts new file mode 100644 index 0000000000..ce1e5428e5 --- /dev/null +++ b/src/main/app/applicationDataReset.ts @@ -0,0 +1,82 @@ +import type { CliLauncherReason, CliLauncherStatus } from '@/cli/launcherService' + +export type ApplicationDataResetType = 'chat' | 'knowledge' | 'config' | 'all' + +type CliLauncherResetPort = Readonly<{ + getStatus(): Promise + removeOwnedLauncher(): Promise +}> + +type ApplicationDataResetLogger = Readonly<{ + warn(message: string, context: Readonly>): void +}> + +export type ApplicationDataResetDependencies = Readonly<{ + cliLauncher: CliLauncherResetPort + logger: ApplicationDataResetLogger + stop(): Promise + resetDataByType(resetType: ApplicationDataResetType): Promise +}> + +type LauncherCleanupReason = + | CliLauncherReason + | 'launcher-conflict' + | 'status-inspection-failed' + | 'launcher-removal-failed' + +function safeErrorCode(error: unknown): string | undefined { + if (!error || typeof error !== 'object' || !('code' in error)) return undefined + const code = (error as { code?: unknown }).code + return typeof code === 'string' && /^[a-z0-9_-]{1,64}$/i.test(code) ? code : undefined +} + +function warnLauncherCleanupIncomplete( + logger: ApplicationDataResetLogger, + reason: LauncherCleanupReason, + error?: unknown +): void { + const errorCode = safeErrorCode(error) + try { + logger.warn('[CLI] Launcher cleanup did not complete during full data reset', { + reason, + ...(errorCode ? { errorCode } : {}) + }) + } catch { + // Diagnostics are best-effort and must never block the data reset they describe. + } +} + +async function removeOwnedLauncherForReset( + cliLauncher: CliLauncherResetPort, + logger: ApplicationDataResetLogger +): Promise { + let status: CliLauncherStatus + try { + status = await cliLauncher.getStatus() + } catch (error) { + warnLauncherCleanupIncomplete(logger, 'status-inspection-failed', error) + return + } + + if (status.state === 'conflict') { + warnLauncherCleanupIncomplete(logger, status.reason ?? 'launcher-conflict') + return + } + + try { + await cliLauncher.removeOwnedLauncher() + } catch (error) { + warnLauncherCleanupIncomplete(logger, 'launcher-removal-failed', error) + } +} + +export async function coordinateApplicationDataReset( + resetType: ApplicationDataResetType, + dependencies: ApplicationDataResetDependencies +): Promise { + await dependencies.stop() + if (resetType === 'all') { + await removeOwnedLauncherForReset(dependencies.cliLauncher, dependencies.logger) + } + await dependencies.resetDataByType(resetType) +} diff --git a/src/main/app/composition.ts b/src/main/app/composition.ts index c3d7ad8f9c..cc8cc3868a 100644 --- a/src/main/app/composition.ts +++ b/src/main/app/composition.ts @@ -1,6 +1,11 @@ import logger from '@shared/logger' import { projectEnvironmentsChangedEvent } from '@shared/contracts/events/project.events' -import { liveDelegationChangedEvent, sessionsUpdatedEvent } from '@shared/contracts/events' +import { + approvalClosedEvent, + approvalRequestedEvent, + liveDelegationChangedEvent, + sessionsUpdatedEvent +} from '@shared/contracts/events' import { performance } from 'node:perf_hooks' import path from 'path' import { DialogService } from '../desktop/dialog' @@ -105,6 +110,7 @@ import { createPlatformRoutes } from '../platform/routes' import { createHookRoutes } from '../hook/routes' import { createAppSettingsRoutes } from './settingsRoutes' import { createAppRoutes } from './routes' +import { ApprovalBroker, createApprovalRoutes } from '@/approval' import { CommandPermissionService, FilePermissionService, @@ -200,8 +206,35 @@ import { createAgentRoutes } from '@/agent/routes' import { createPromptRoutes } from '@/agent/promptRoutes' import { AgentSessionExportService } from '../exporter/agentSessionExporter' import { createInMemoryServerFactory } from '../mcp/inMemoryServers/builder' -import { createRouteDispatcher, registerDeepchatRoutes } from '@/routes' +import { + createRouteDispatcher, + dispatchDeepchatRoute, + registerDeepchatRoutes, + type RouteDispatcher +} from '@/routes' import { createNodeScheduler } from '@/routes/scheduler' +import { coordinateApplicationDataReset } from './applicationDataReset' +import { + AgentCliCommandAccess, + AgentCliTokenAuthority, + ArtifactSpool, + CliAudioTranscriptionService, + CliAuditLog, + CliComputeService, + CliLauncherService, + CliMutationGuard, + CliOcrService, + CliRequestPolicy, + CliRunService, + CliServer, + CliSkillService, + createArtifactRoutes, + createCliComputeRoutes, + createCliMcpAdminRoutes, + createCliProviderModelAdminRoutes, + createCliRoutes, + resolveBundledCliDirectory +} from '@/cli' import { AcpRegistryMigrationService } from '@/agent/acp/catalog/acpRegistryMigrationService' import { killTerminal } from '@/agent/acp/launch/acpInitHelper' import { rtkRuntimeService } from '@/agent/shared/process/rtkRuntimeService' @@ -213,6 +246,8 @@ import { } from './startupMigrations/sessionDataMigrations' import { activateAppOnMac } from '@/lib/activateApp' import { SessionRuntimeEvents } from '@/session/runtimeEvents' +import { TypedEventHub } from '@/events/typedEventHub' +import { SessionEventRouter } from '@/events/sessionEventRouter' import { createMemoryProviderBindings } from './memoryProviderBindings' import { EpisodeRegistry, @@ -319,6 +354,7 @@ export async function createMainProcessControl(dependencies: { let commandPermissionService: CommandPermissionService let filePermissionService: FilePermissionService let settingsPermissionService: SettingsPermissionService + let approvalBroker: ApprovalBroker let toolPermissionBroker: ToolPermissionBroker let legacyChatImportService: LegacyChatImportService let usageStatsService: UsageStatsService @@ -330,6 +366,14 @@ export async function createMainProcessControl(dependencies: { let liveDelegationService: LiveDelegationService let acpAsLlmProviderSessionControl: AcpAsLlmProviderSessionControlPort let acpAsLlmProviderPermission: AcpAsLlmProviderPermissionPort + let routeDispatcher: RouteDispatcher | undefined + let cliComputeService: CliComputeService + let cliAudioTranscriptionService: CliAudioTranscriptionService + let cliOcrService: CliOcrService + let cliSkillService: CliSkillService + let cliMutationGuard: CliMutationGuard + let cliRequestPolicy: CliRequestPolicy + let cliRunService: CliRunService let hasInitialized = false let databaseMaintenanceState: 'running' | 'maintenance' | 'failed' = 'running' let appLifecycleState: 'starting' | 'running' | 'stopping' | 'stopped' = 'starting' @@ -350,16 +394,104 @@ export async function createMainProcessControl(dependencies: { dependencies.onWindowCreated, startupWorkloadCoordinator ) + // No CLI sessions can exist before AppSessionService is ready, so startup events retain the + // renderer compatibility path. The installed resolver below fails closed for missing sessions. + let resolveSessionRunId = (_sessionId: string): string | null | undefined => null + let resolveBoundRendererIds = (_sessionId: string): readonly number[] => [] + const typedEventHub = new TypedEventHub({ + renderer: { + broadcast: (envelope) => windowPresenter.sendToAllWindows(DEEPCHAT_EVENT_CHANNEL, envelope), + send: (webContentsId, envelope) => + (windowPresenter as WindowPresenter).sendToWebContents( + webContentsId, + DEEPCHAT_EVENT_CHANNEL, + envelope + ) + }, + log: logger + }) + const sessionEventRouter = new SessionEventRouter({ + hub: typedEventHub, + resolveSessionRunId: (sessionId) => resolveSessionRunId(sessionId), + getBoundRendererIds: (sessionId) => resolveBoundRendererIds(sessionId) + }) + const agentCliTokenAuthority = new AgentCliTokenAuthority() + const artifactSpool = new ArtifactSpool({ + directory: path.join(app.getPath('userData'), 'local-control', 'artifacts'), + consumeAgentBytes: (tokenId, bytes) => agentCliTokenAuthority.consumeBytes(tokenId, bytes), + log: logger + }) + const cliAuditLog = new CliAuditLog({ + directory: path.join(app.getPath('userData'), 'local-control') + }) + const cliServer = new CliServer({ + userDataPath: app.getPath('userData'), + appVersion: app.getVersion(), + dispatch: async (method, input, caller, signal) => { + if (cliAudioTranscriptionService?.handlesRpc(method)) { + assertRouteAllowedDuringDatabaseMaintenance(method) + return await cliAudioTranscriptionService.dispatchRpc(method, input, caller, signal) + } + if (cliOcrService?.handlesRpc(method)) { + assertRouteAllowedDuringDatabaseMaintenance(method) + return await cliOcrService.dispatchRpc(method, input, caller, signal) + } + if (!routeDispatcher) throw new Error('CLI route dispatcher is not ready') + signal.throwIfAborted() + const output = await dispatchDeepchatRoute(routeDispatcher, method, input, { caller }) + signal.throwIfAborted() + return output + }, + dispatchStream: async (method, input, caller, requestId, signal, emit) => { + if (cliRunService?.handlesStream(method)) { + assertRouteAllowedDuringDatabaseMaintenance(method) + return await cliRunService.dispatchStream(method, input, caller, signal, emit) + } + if (!cliComputeService) throw new Error('CLI compute service is not ready') + assertRouteAllowedDuringDatabaseMaintenance(method) + return await cliComputeService.dispatchStream(method, input, caller, requestId, signal, emit) + }, + dispatchUpload: async (method, input, upload, caller, signal) => { + assertRouteAllowedDuringDatabaseMaintenance(method) + if (cliAudioTranscriptionService?.handlesUpload(method)) { + return await cliAudioTranscriptionService.dispatchUpload( + method, + input, + upload, + caller, + signal + ) + } + if (cliOcrService?.handlesUpload(method)) { + return await cliOcrService.dispatchUpload(method, input, upload, caller, signal) + } + if (cliSkillService?.handlesUpload(method)) { + return await cliSkillService.dispatchUpload(method, input, upload, caller, signal) + } + throw new Error(`CLI upload service is not ready for ${method}`) + }, + authorize: async (input) => { + if (!cliRequestPolicy) throw new Error('CLI request policy is not ready') + return await cliRequestPolicy.authorize(input) + }, + beginAgentRequest: (token) => agentCliTokenAuthority.beginRequest(token), + artifactSpool, + log: logger + }) const semanticNotificationScheduler = new TimeoutNotificationScheduler() const semanticNotificationEpisodes = new EpisodeRegistry( systemNotificationClock, semanticNotificationScheduler ) let handleSemanticRendererUnavailable = (_webContentsId: number): void => undefined + let handleApprovalRendererUnavailable = (_webContentsId: number): void => undefined const semanticNotificationTargets = new ElectronWindowNotificationTargets( windowPresenter, () => tabPresenter, - (webContentsId) => handleSemanticRendererUnavailable(webContentsId) + (webContentsId) => { + handleSemanticRendererUnavailable(webContentsId) + handleApprovalRendererUnavailable(webContentsId) + } ) const semanticNotificationDiagnostics = new AggregatedWindowNotificationDiagnostics({ scheduler: semanticNotificationScheduler, @@ -392,10 +524,7 @@ export async function createMainProcessControl(dependencies: { } } const publishDeepchatEvent = (name: DeepchatEventName, payload: unknown): void => { - windowPresenter.sendToAllWindows( - DEEPCHAT_EVENT_CHANNEL, - createDeepchatEventEnvelope(name, payload) - ) + sessionEventRouter.publish(name, payload) } dependencies.mcpAppSandboxRegistry.setConsentPublisher((windowId, payload) => { windowPresenter.sendToWindow( @@ -458,6 +587,18 @@ export async function createMainProcessControl(dependencies: { appSessionService = new AppSessionService(projectDatabase, sessionData.database, () => projectService.notifyEnvironmentProjectionChanged() ) + resolveSessionRunId = (sessionId) => { + const visited = new Set() + let currentSessionId: string | null = sessionId + while (currentSessionId && visited.size < 32 && !visited.has(currentSessionId)) { + visited.add(currentSessionId) + const session = appSessionService.get(currentSessionId) + if (!session) return undefined + if (session.metadata?.source === 'cli_run') return session.id + currentSessionId = session.parentSessionId ?? null + } + return currentSessionId ? undefined : null + } sessionDataMigrationSQLite = { get appSettingsTable() { return settingsDatabase.appSettingsTable @@ -598,6 +739,19 @@ export async function createMainProcessControl(dependencies: { acpSessionPersistence, publishDeepchatEvent ) + cliComputeService = new CliComputeService({ + providerSettings, + providerRuntime, + artifactSpool, + mediaCacheDirectory: path.join(app.getPath('userData'), 'images'), + log: logger + }) + cliAudioTranscriptionService = new CliAudioTranscriptionService({ + providerSettings, + providerRuntime, + artifactSpool, + log: logger + }) const agentDefaults = new DeepChatDefaults({ settings: dependencies.settingsStore, publishSettingChanged: (key, value) => @@ -616,10 +770,78 @@ export async function createMainProcessControl(dependencies: { acpAsLlmProviderSessionControl = providerRuntime acpAsLlmProviderPermission = providerRuntime const commandPermissionHandler = new CommandPermissionService() + const resolveCliDirectory = () => + resolveBundledCliDirectory({ + appPath: app.getAppPath(), + resourcesPath: process.resourcesPath, + isPackaged: app.isPackaged + }) + const cliLauncherService = new CliLauncherService({ + homeDirectory: app.getPath('home'), + userDataDirectory: app.getPath('userData'), + environmentPath: process.env.PATH, + shell: process.env.SHELL, + localAppDataDirectory: process.env.LOCALAPPDATA, + resolveCliDirectory + }) + const agentCliCommandAccess = new AgentCliCommandAccess({ + tokenAuthority: agentCliTokenAuthority, + commandPermission: commandPermissionHandler, + resolveCliDirectory + }) commandPermissionService = commandPermissionHandler filePermissionService = new FilePermissionService() settingsPermissionService = new SettingsPermissionService() - toolPermissionBroker = new ToolPermissionBroker() + approvalBroker = new ApprovalBroker({ log: logger }) + toolPermissionBroker = new ToolPermissionBroker({ approvalBroker }) + cliMutationGuard = new CliMutationGuard(approvalBroker, { + getTarget: async () => { + const focused = await semanticNotificationTargets.getFocusedTarget() + const target = + focused?.kind === 'main' + ? focused + : (await semanticNotificationTargets.getExistingTargets()).find( + (candidate) => candidate.kind === 'main' + ) + return target ? { windowId: target.windowId, webContentsId: target.webContentsId } : null + }, + present: async (target, payload) => { + const readyTarget = await semanticNotificationTargets.getTargetForWindow(target.windowId) + if ( + !readyTarget || + readyTarget.kind !== 'main' || + readyTarget.webContentsId !== target.webContentsId + ) { + return false + } + windowPresenter.show(target.windowId, true) + return await semanticNotificationTargets.sendDeepchatEvent( + readyTarget, + approvalRequestedEvent.name, + payload + ) + }, + close: async (target, payload) => { + const readyTarget = await semanticNotificationTargets.getTargetByWebContents( + target.webContentsId + ) + if (!readyTarget || readyTarget.kind !== 'main' || readyTarget.windowId !== target.windowId) { + return + } + await semanticNotificationTargets.sendDeepchatEvent( + readyTarget, + approvalClosedEvent.name, + payload + ) + } + }) + handleApprovalRendererUnavailable = (webContentsId) => { + cliMutationGuard.cancelRenderer(webContentsId) + } + cliRequestPolicy = new CliRequestPolicy({ + mutationGuard: cliMutationGuard, + audit: (record) => cliAuditLog.record(record) + }) const liveDelegationConsent = new LiveDelegationConsentAuthority() deviceService = new DeviceService() const loggingService = new LoggingService( @@ -672,6 +894,12 @@ export async function createMainProcessControl(dependencies: { tempBaseDir: app.getPath('temp'), userDataDir: app.getPath('userData') }) + cliOcrService = new CliOcrService({ + appVersion: app.getVersion(), + ocrRuntime: ocrRuntimeService, + artifactSpool, + log: logger + }) const attachmentRouter = new AttachmentCapabilityRouter({ extraction: ocrRuntimeService, getAutomaticOcrEnabled: () => ocrSettings.getAutomaticExtractionEnabled(), @@ -841,6 +1069,16 @@ export async function createMainProcessControl(dependencies: { })) } ) + cliSkillService = new CliSkillService({ + skills: skillService, + agentExists: async (agentId) => (await agentSettings.getAgent(agentId))?.type === 'deepchat', + recordSettingsActivity: (input) => { + void settingsDatabase.recordSettingsActivity(input).catch((error) => { + logger.warn('[SettingsActivity] Failed to record CLI Skill activity:', error) + }) + }, + log: logger + }) const agentInvocationAdmission = new AgentInvocationAdmission() const agentToolDependencies: AgentToolDependencies = { @@ -1015,6 +1253,7 @@ export async function createMainProcessControl(dependencies: { skillSettings, desktopSettings, commandPermissionHandler, + commandEnvironment: agentCliCommandAccess, permissionBroker: toolPermissionBroker, liveDelegationConsent, agentTools: agentToolDependencies, @@ -1064,6 +1303,7 @@ export async function createMainProcessControl(dependencies: { } sessionPermissionPort = { clearSessionPermissions: (sessionId) => { + agentCliTokenAuthority.revokeConversation(sessionId) commandPermissionService.clearConversation(sessionId) filePermissionService.clearConversation(sessionId) settingsPermissionService.clearConversation(sessionId) @@ -1294,6 +1534,8 @@ export async function createMainProcessControl(dependencies: { ui: sessionUiPort }) desktopSessionBinding = new DesktopSessionBinding(sessionQuery) + resolveBoundRendererIds = (sessionId) => + desktopSessionBinding.getWebContentsIdsForSession(sessionId) tabPresenter = new TabPresenter(windowPresenter, desktopSessionBinding, () => deeplinkService.processStartupUrl() ) @@ -1444,6 +1686,14 @@ export async function createMainProcessControl(dependencies: { permissions: sessionPermissionPort, agentLifecycle }) + cliRunService = new CliRunService({ + lifecycle: sessionLifecycle, + turn: sessionTurn, + projection: sessionQuery, + sessions: appSessionService, + eventHub: typedEventHub, + log: logger + }) sessionHistorySearch = new SessionHistorySearch(sessionData.database, appSessionService) agentSessionExportService = new AgentSessionExportService({ agentManager: agentManager, @@ -1853,6 +2103,12 @@ export async function createMainProcessControl(dependencies: { } async function destroy(): Promise { + await runDestroyStep('agentCliTokenAuthority.clear', () => agentCliTokenAuthority.clear()) + await runDestroyStep('cliServer.stop', () => cliServer.stop()) + await runDestroyStep('typedEventHub.close', () => typedEventHub.close()) + await runDestroyStep('cliMutationGuard.clear', () => cliMutationGuard.clear()) + await runDestroyStep('cliAuditLog.close', () => cliAuditLog.close()) + await runDestroyStep('artifactSpool.close', () => artifactSpool.close()) await runDestroyStep('providerCatalog.unsubscribe', () => unsubscribeProviderDbCatalog()) await runDestroyStep('liveDelegationService.stop', () => liveDelegationService.stop()) await runDestroyStep('cronJobs.destroy', () => cronJobs.destroy()) @@ -1970,6 +2226,7 @@ export async function createMainProcessControl(dependencies: { } function registerRoutes(): void { + const providerQueryScheduler = createNodeScheduler() const providerRoutes = createProviderRoutes({ providerSettings, providerRuntime, @@ -1981,7 +2238,7 @@ export async function createMainProcessControl(dependencies: { updateProvidersBatch: (batchUpdate) => providerRuntime.updateProvidersBatch(batchUpdate) }), oauthService, - scheduler: createNodeScheduler(), + scheduler: providerQueryScheduler, recordSettingsActivity: (input) => settingsDatabase.recordSettingsActivity(input) }) const toolRoutes = createToolRoutes(toolService) @@ -2169,8 +2426,8 @@ export async function createMainProcessControl(dependencies: { const appRoutes = createAppRoutes({ logging: loggingService, rendererPerformance: rendererPerformanceLogService, - isMainWindowContext: (context) => - windowPresenter.mainWindow?.webContents.id === context.webContentsId, + isMainWindowContext: (caller) => + windowPresenter.mainWindow?.webContents.id === caller.webContentsId, agentSettings, projects: projectService, databaseSecurity: databaseSecurityService, @@ -2210,7 +2467,41 @@ export async function createMainProcessControl(dependencies: { }, splash: dependencies.splash }) - const routeDispatcher = createRouteDispatcher({ + const cliRoutes = createCliRoutes({ + appVersion: app.getVersion(), + getStatus: () => cliServer.getStatus(), + hasTrustedRenderer: async () => + (await semanticNotificationTargets.getExistingTargets()).some( + (target) => target.kind === 'main' + ) + }) + const approvalRoutes = createApprovalRoutes({ + resolve: (input, caller) => cliMutationGuard.resolve(input, caller) + }) + const artifactRoutes = createArtifactRoutes(artifactSpool) + const cliComputeRoutes = createCliComputeRoutes(cliComputeService) + const cliProviderModelAdminRoutes = createCliProviderModelAdminRoutes({ + providerSettings, + providerRuntime, + scheduler: providerQueryScheduler, + recordSettingsActivity: (input) => { + void settingsDatabase.recordSettingsActivity(input).catch((error) => { + console.warn('[SettingsActivity] Failed to record CLI provider activity:', error) + }) + } + }) + const cliSkillRoutes = cliSkillService.createRoutes() + const cliMcpAdminRoutes = createCliMcpAdminRoutes({ + mcp: mcpService, + recordSettingsActivity: (input) => { + void settingsDatabase.recordSettingsActivity(input).catch((error) => { + console.warn('[SettingsActivity] Failed to record CLI MCP activity:', error) + }) + }, + log: logger + }) + const cliRunRoutes = cliRunService.createRoutes() + routeDispatcher = createRouteDispatcher({ appDatabaseMaintenance: { assertRouteAllowed: (routeName) => assertRouteAllowedDuringDatabaseMaintenance(routeName) }, @@ -2243,7 +2534,15 @@ export async function createMainProcessControl(dependencies: { hookRoutes, notificationRoutes, appSettingsRoutes, - appRoutes + appRoutes, + approvalRoutes, + cliRoutes, + artifactRoutes, + cliComputeRoutes, + cliProviderModelAdminRoutes, + cliSkillRoutes, + cliMcpAdminRoutes, + cliRunRoutes ], settingsWindow: windowPresenter, startupWorkloadCoordinator @@ -2542,8 +2841,12 @@ export async function createMainProcessControl(dependencies: { async function resetApplicationData( resetType: 'chat' | 'knowledge' | 'config' | 'all' ): Promise { - await stop() - await deviceService.resetDataByType(resetType) + await coordinateApplicationDataReset(resetType, { + cliLauncher: cliLauncherService, + logger, + stop, + resetDataByType: (type) => deviceService.resetDataByType(type) + }) } async function restartApplication(): Promise { @@ -2597,7 +2900,7 @@ export async function createMainProcessControl(dependencies: { commandPermissionService.clearAll() filePermissionService.clearAll() settingsPermissionService.clearAll() - toolPermissionBroker.clear() + approvalBroker.clear() dependencies.mcpAppSandboxRegistry.clear() }, confirmShutdown: async () => await knowledgeService.confirmShutdown(), @@ -2632,6 +2935,19 @@ export async function createMainProcessControl(dependencies: { cronJobs.start() memoryService.startBackgroundMaintenance() appLifecycleState = 'running' + try { + await artifactSpool.initialize() + await cliServer.start() + } catch (error) { + logger.error('[CLI] Failed to start local control server', error) + } + if (cliServer.getStatus().running) { + try { + await cliLauncherService.ensureInstalled() + } catch (error) { + logger.warn('[CLI] Failed to install or refresh the command launcher', error) + } + } init(dependencies.startupRunId) scheduleBackgroundWork() return control diff --git a/src/main/app/routes.ts b/src/main/app/routes.ts index 2af85ef544..348368e370 100644 --- a/src/main/app/routes.ts +++ b/src/main/app/routes.ts @@ -19,7 +19,12 @@ import { import type { DatabaseSecurityService } from './databaseSecurity' import type { StartupWorkloadCoordinator } from '@/app/startupWorkloadCoordinator' import type { SessionQuery } from '@/session/query' -import { createRouteMap, type DeepchatRouteMap, type RouteContext } from '@/routes/routeRegistry' +import { + createRouteMap, + requireRendererCaller, + type DeepchatRouteMap, + type RendererRouteCaller +} from '@/routes/routeRegistry' import { createDebugMockChatSession, type DebugMockChatDatabase @@ -32,7 +37,7 @@ import type { SplashWindow } from './splashWindow' export function createAppRoutes(deps: { logging: Pick rendererPerformance: Pick - isMainWindowContext(context: RouteContext): boolean + isMainWindowContext(caller: RendererRouteCaller): boolean agentSettings: Pick projects: Pick databaseSecurity: Pick @@ -136,7 +141,8 @@ export function createAppRoutes(deps: { performanceRecordRendererRoute.name, async (rawInput, context) => { const record = performanceRecordRendererRoute.input.parse(rawInput) - if (!deps.isMainWindowContext(context)) { + const caller = requireRendererCaller(context) + if (!deps.isMainWindowContext(caller)) { return performanceRecordRendererRoute.output.parse({ accepted: false }) } const accepted = await deps.rendererPerformance.record(record) @@ -147,6 +153,7 @@ export function createAppRoutes(deps: { startupGetBootstrapRoute.name, async (rawInput, context) => { startupGetBootstrapRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return await deps.startup.scheduleTask({ id: 'main.bootstrap:route', target: 'main', @@ -157,7 +164,7 @@ export function createAppRoutes(deps: { dedupeKey: 'main.bootstrap:route', runId: deps.startup.getRunId('main'), run: async () => { - const activeSessionId = deps.desktopSession.getActiveId(context.webContentsId) + const activeSessionId = deps.desktopSession.getActiveId(caller.webContentsId) const activeSession = activeSessionId ? ((await deps.startupSession.getLightweightByIds([activeSessionId]))[0] ?? null) : null diff --git a/src/main/app/settingsRoutes.ts b/src/main/app/settingsRoutes.ts index 6a3c1e17db..3ebd3422aa 100644 --- a/src/main/app/settingsRoutes.ts +++ b/src/main/app/settingsRoutes.ts @@ -3,8 +3,10 @@ import { configGetEntriesRoute, configUpdateEntriesRoute, settingsActivityListRoute, + settingsGetPublicRoute, settingsGetSnapshotRoute, settingsListSystemFontsRoute, + settingsUpdatePublicRoute, settingsUpdateRoute, type ConfigEntryKey, type ConfigEntryValues, @@ -171,6 +173,22 @@ export function createAppSettingsRoutes(deps: { summaryParams: { key: change.key } }) } + const getSnapshot = (keys?: SettingsKey[]) => ({ + version: Date.now(), + values: pickSnapshot(readSnapshot(), keys) + }) + const updateSnapshot = (changes: SettingsChange[]) => { + for (const change of changes) { + applyChange(change) + recordChange(change) + } + const changedKeys = changes.map((change) => change.key) + return { + version: Date.now(), + changedKeys, + values: pickSnapshot(readSnapshot(), changedKeys) + } + } return createRouteMap([ [ @@ -199,10 +217,14 @@ export function createAppSettingsRoutes(deps: { settingsGetSnapshotRoute.name, async (rawInput) => { const input = settingsGetSnapshotRoute.input.parse(rawInput) - return settingsGetSnapshotRoute.output.parse({ - version: Date.now(), - values: pickSnapshot(readSnapshot(), input.keys) - }) + return settingsGetSnapshotRoute.output.parse(getSnapshot(input.keys)) + } + ], + [ + settingsGetPublicRoute.name, + async (rawInput) => { + const input = settingsGetPublicRoute.input.parse(rawInput) + return settingsGetPublicRoute.output.parse(getSnapshot(input.keys)) } ], [ @@ -218,16 +240,14 @@ export function createAppSettingsRoutes(deps: { settingsUpdateRoute.name, async (rawInput) => { const input = settingsUpdateRoute.input.parse(rawInput) - for (const change of input.changes) { - applyChange(change) - recordChange(change) - } - const changedKeys = input.changes.map((change) => change.key) - return settingsUpdateRoute.output.parse({ - version: Date.now(), - changedKeys, - values: pickSnapshot(readSnapshot(), changedKeys) - }) + return settingsUpdateRoute.output.parse(updateSnapshot(input.changes)) + } + ], + [ + settingsUpdatePublicRoute.name, + async (rawInput) => { + const input = settingsUpdatePublicRoute.input.parse(rawInput) + return settingsUpdatePublicRoute.output.parse(updateSnapshot(input.changes)) } ], [ diff --git a/src/main/approval/approvalBroker.ts b/src/main/approval/approvalBroker.ts new file mode 100644 index 0000000000..69269baf21 --- /dev/null +++ b/src/main/approval/approvalBroker.ts @@ -0,0 +1,542 @@ +import { createHash, randomUUID } from 'node:crypto' +import type { JsonValue } from '@shared/contracts/json' + +const MAX_ARGUMENT_BYTES = 1024 * 1024 +const MAX_REDACTED_DISPLAY_BYTES = 16 * 1024 +const MAX_ARGUMENT_PREVIEW_BYTES = 16 * 1024 +const MAX_ARGUMENT_DEPTH = 64 +const MAX_ARGUMENT_KEYS = 10_000 +const MAX_DOMAIN_BYTES = 128 +const MAX_SCOPE_KEY_BYTES = 512 +const MAX_OPERATION_BYTES = 256 +const MAX_EFFECT_BYTES = 128 +const MAX_BINDING_KEY_BYTES = 64 * 1024 +const DEFAULT_MAX_PENDING_PER_SCOPE = 64 +const DEFAULT_REQUEST_TIMEOUT_MS = 2 * 60_000 + +export type ApprovalDecision = + | Readonly<{ allowed: true }> + | Readonly<{ allowed: false; reason: 'denied' | 'cancelled' | 'timeout' }> + +export type ApprovalResolution = Readonly<{ + requestId: string + scopeKey: string + decision: 'approved' | 'denied' | 'cancelled' +}> + +export type ApprovalBinding = Readonly<{ + domain: string + scopeKey: string + operation: string + effect: string + bindingKey: string + arguments: unknown + redactedDisplayData?: JsonValue + metadata: TMetadata +}> + +export type ApprovalCreateOptions = Readonly<{ + deduplicatePending?: boolean + includeArgumentsPreview?: boolean + consumeOnApprove?: boolean + timeoutMs?: number + signal?: AbortSignal +}> + +export type ApprovalSnapshot = Readonly<{ + requestId: string + domain: string + scopeKey: string + operation: string + effect: string + argumentsHash: string + argumentsPreview?: string + redactedDisplayData?: JsonValue + status: 'pending' | 'approved' + expiresAt: number + metadata: TMetadata +}> + +export type ApprovalPublicSnapshot = Omit, 'metadata'> + +export type ApprovalMatch = Readonly<{ + requestId?: string + domain: string + scopeKey: string + operation: string + effect: string + bindingKey: string + arguments: unknown +}> + +export type ApprovalEvent = + | Readonly<{ type: 'created'; approval: ApprovalPublicSnapshot }> + | Readonly<{ + type: 'resolved' + approval: ApprovalPublicSnapshot + decision: ApprovalDecision + }> + | Readonly<{ + type: 'removed' + approval: ApprovalPublicSnapshot + reason: 'consumed' | 'denied' | 'cancelled' | 'timeout' | 'cleared' + }> + +export type ApprovalBrokerOptions = Readonly<{ + defaultTimeoutMs?: number + maxPendingPerScope?: number + now?: () => number + createRequestId?: () => string + log?: Pick +}> + +type PendingApproval = { + requestId: string + domain: string + scopeKey: string + operation: string + effect: string + bindingKey: string + argumentsHash: string + argumentsPreview?: string + redactedDisplayData?: JsonValue + metadata: unknown + status: 'pending' | 'approved' + consumeOnApprove: boolean + expiresAt: number + timeout: NodeJS.Timeout + settlers: Set<(decision: ApprovalDecision) => void> + abortCleanups: Set<() => void> +} + +type CanonicalizeState = { + keys: number + seen: WeakSet +} + +export class ApprovalCapacityError extends Error { + constructor(readonly scopeKey: string) { + super('Too many pending approval requests for scope') + this.name = 'ApprovalCapacityError' + } +} + +function canonicalize(value: unknown, state: CanonicalizeState, depth = 0): unknown { + if (depth > MAX_ARGUMENT_DEPTH) { + throw new Error('Approval arguments exceed the depth limit') + } + if (Array.isArray(value)) { + if (state.seen.has(value)) throw new Error('Approval arguments must not contain cycles') + state.seen.add(value) + const output = value.map((entry) => canonicalize(entry, state, depth + 1)) + state.seen.delete(value) + return output + } + + if (value && typeof value === 'object') { + if (state.seen.has(value)) throw new Error('Approval arguments must not contain cycles') + state.seen.add(value) + const output = Object.fromEntries( + Object.entries(value as Record) + .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)) + .map(([key, entry]) => { + state.keys += 1 + if (state.keys > MAX_ARGUMENT_KEYS) { + throw new Error('Approval arguments exceed the key limit') + } + return [key, canonicalize(entry, state, depth + 1)] + }) + ) + state.seen.delete(value) + return output + } + + if ( + value !== null && + typeof value !== 'string' && + typeof value !== 'number' && + typeof value !== 'boolean' && + value !== undefined + ) { + throw new Error('Approval arguments must be JSON-compatible') + } + if (typeof value === 'number' && !Number.isFinite(value)) { + throw new Error('Approval arguments must contain only finite numbers') + } + return value +} + +function serializeArguments(value: unknown): { + hash: string + preview: string +} { + const serialized = + JSON.stringify(canonicalize(value, { keys: 0, seen: new WeakSet() })) ?? 'null' + const bytes = Buffer.byteLength(serialized, 'utf8') + if (bytes > MAX_ARGUMENT_BYTES) { + throw new Error(`Approval arguments exceed the ${MAX_ARGUMENT_BYTES}-byte limit`) + } + + return { + hash: createHash('sha256').update(serialized).digest('hex'), + preview: + bytes <= MAX_ARGUMENT_PREVIEW_BYTES + ? serialized + : `${Buffer.from(serialized).subarray(0, MAX_ARGUMENT_PREVIEW_BYTES).toString('utf8')}…` + } +} + +function canonicalizeRedactedDisplayData(value: JsonValue | undefined): JsonValue | undefined { + if (value === undefined) return undefined + const canonical = canonicalize(value, { keys: 0, seen: new WeakSet() }) + const serialized = JSON.stringify(canonical) + if ( + serialized === undefined || + Buffer.byteLength(serialized, 'utf8') > MAX_REDACTED_DISPLAY_BYTES + ) { + throw new Error('Redacted approval display data exceeds its byte limit') + } + return JSON.parse(serialized) as JsonValue +} + +function cloneJsonValue(value: JsonValue): JsonValue { + return structuredClone(value) +} + +function positiveSafeInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value <= 0) { + throw new Error(`${name} must be a positive safe integer`) + } + return value +} + +function boundedString(value: string, name: string, maxBytes: number): string { + if (!value.trim()) throw new Error(`${name} must not be empty`) + if (Buffer.byteLength(value, 'utf8') > maxBytes) { + throw new Error(`${name} exceeds its byte limit`) + } + return value +} + +export function hashApprovalArguments(value: unknown): string { + return serializeArguments(value).hash +} + +export class ApprovalBroker { + private readonly defaultTimeoutMs: number + private readonly maxPendingPerScope: number + private readonly now: () => number + private readonly createRequestId: () => string + private readonly log: Pick + private readonly pending = new Map() + private readonly listeners = new Set<(event: ApprovalEvent) => void>() + + constructor(options: ApprovalBrokerOptions = {}) { + this.defaultTimeoutMs = positiveSafeInteger( + options.defaultTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS, + 'defaultTimeoutMs' + ) + this.maxPendingPerScope = positiveSafeInteger( + options.maxPendingPerScope ?? DEFAULT_MAX_PENDING_PER_SCOPE, + 'maxPendingPerScope' + ) + this.now = options.now ?? Date.now + this.createRequestId = options.createRequestId ?? randomUUID + this.log = options.log ?? console + } + + create( + binding: ApprovalBinding, + options: ApprovalCreateOptions = {} + ): ApprovalSnapshot { + options.signal?.throwIfAborted() + this.pruneExpired() + const serialized = serializeArguments(binding.arguments) + const domain = boundedString(binding.domain, 'Approval domain', MAX_DOMAIN_BYTES) + const scopeKey = boundedString(binding.scopeKey, 'Approval scope key', MAX_SCOPE_KEY_BYTES) + const operation = boundedString(binding.operation, 'Approval operation', MAX_OPERATION_BYTES) + const effect = boundedString(binding.effect, 'Approval effect', MAX_EFFECT_BYTES) + const bindingKey = boundedString( + binding.bindingKey, + 'Approval binding key', + MAX_BINDING_KEY_BYTES + ) + + if (options.deduplicatePending) { + const existing = Array.from(this.pending.values()).find( + (entry) => + entry.status === 'pending' && + entry.domain === domain && + entry.scopeKey === scopeKey && + entry.operation === operation && + entry.effect === effect && + entry.bindingKey === bindingKey && + entry.argumentsHash === serialized.hash + ) + if (existing) { + this.attachAbort(existing, options.signal) + options.signal?.throwIfAborted() + return this.toSnapshot(existing) as ApprovalSnapshot + } + } + + const scopePending = Array.from(this.pending.values()).filter( + (entry) => entry.scopeKey === scopeKey + ).length + if (scopePending >= this.maxPendingPerScope) throw new ApprovalCapacityError(scopeKey) + + const timeoutMs = positiveSafeInteger( + options.timeoutMs ?? this.defaultTimeoutMs, + 'approval timeoutMs' + ) + const now = this.now() + if (!Number.isSafeInteger(now) || now < 0 || now > Number.MAX_SAFE_INTEGER - timeoutMs) { + throw new Error('Approval clock is outside the supported range') + } + const requestId = this.allocateRequestId() + const pending: PendingApproval = { + requestId, + domain, + scopeKey, + operation, + effect, + bindingKey, + argumentsHash: serialized.hash, + ...(options.includeArgumentsPreview ? { argumentsPreview: serialized.preview } : {}), + ...(binding.redactedDisplayData !== undefined + ? { redactedDisplayData: canonicalizeRedactedDisplayData(binding.redactedDisplayData) } + : {}), + metadata: binding.metadata, + status: 'pending', + consumeOnApprove: options.consumeOnApprove ?? false, + expiresAt: now + timeoutMs, + settlers: new Set(), + abortCleanups: new Set(), + timeout: setTimeout(() => this.expire(requestId), timeoutMs) + } + pending.timeout.unref() + this.pending.set(requestId, pending) + this.attachAbort(pending, options.signal) + options.signal?.throwIfAborted() + this.emit({ type: 'created', approval: this.toPublicSnapshot(pending) }) + return this.toSnapshot(pending) as ApprovalSnapshot + } + + async wait(requestId: string, signal?: AbortSignal): Promise { + this.pruneExpired() + const pending = this.pending.get(requestId) + if (!pending) return { allowed: false, reason: 'cancelled' } + if (signal?.aborted) { + this.resolve({ requestId, scopeKey: pending.scopeKey, decision: 'cancelled' }) + return { allowed: false, reason: 'cancelled' } + } + if (pending.status === 'approved') { + if (pending.consumeOnApprove) this.deletePending(pending, 'consumed') + return { allowed: true } + } + + return await new Promise((resolve) => { + pending.settlers.add(resolve) + this.attachAbort(pending, signal) + }) + } + + resolve(resolution: ApprovalResolution): boolean { + this.pruneExpired() + const pending = this.pending.get(resolution.requestId) + if (!pending || pending.scopeKey !== resolution.scopeKey) return false + + if (resolution.decision === 'approved') { + if (pending.status !== 'pending') return false + pending.status = 'approved' + const decision = { allowed: true } as const + const hadWaiters = pending.settlers.size > 0 + this.settle(pending, decision) + this.emit({ + type: 'resolved', + approval: this.toPublicSnapshot(pending), + decision + }) + if (pending.consumeOnApprove && hadWaiters) this.deletePending(pending, 'consumed') + return true + } + + const decision: ApprovalDecision = { + allowed: false, + reason: resolution.decision === 'denied' ? 'denied' : 'cancelled' + } + this.settle(pending, decision) + this.emit({ + type: 'resolved', + approval: this.toPublicSnapshot(pending), + decision + }) + this.deletePending(pending, decision.reason) + return true + } + + consumeApproved(match: ApprovalMatch): boolean { + this.pruneExpired() + const argumentsHash = hashApprovalArguments(match.arguments) + const approved = Array.from(this.pending.values()).find( + (entry) => + entry.status === 'approved' && + (match.requestId === undefined || entry.requestId === match.requestId) && + entry.domain === match.domain && + entry.scopeKey === match.scopeKey && + entry.operation === match.operation && + entry.effect === match.effect && + entry.bindingKey === match.bindingKey && + entry.argumentsHash === argumentsHash + ) + if (!approved) return false + this.deletePending(approved, 'consumed') + return true + } + + cancelScope(scopeKey: string): void { + for (const pending of Array.from(this.pending.values())) { + if (pending.scopeKey === scopeKey) { + this.resolve({ + requestId: pending.requestId, + scopeKey, + decision: 'cancelled' + }) + } + } + } + + clearDomain(domain: string): void { + this.clearMatching((pending) => pending.domain === domain) + } + + clear(): void { + this.clearMatching(() => true) + } + + subscribe(listener: (event: ApprovalEvent) => void): () => void { + this.listeners.add(listener) + return () => this.listeners.delete(listener) + } + + private clearMatching(predicate: (pending: PendingApproval) => boolean): void { + for (const pending of Array.from(this.pending.values())) { + if (!predicate(pending)) continue + const decision = { allowed: false, reason: 'cancelled' } as const + this.settle(pending, decision) + this.emit({ + type: 'resolved', + approval: this.toPublicSnapshot(pending), + decision + }) + this.deletePending(pending, 'cleared') + } + } + + private allocateRequestId(): string { + for (let attempt = 0; attempt < 8; attempt += 1) { + const requestId = this.createRequestId() + if (!/^[A-Za-z0-9_-]{16,128}$/.test(requestId)) { + throw new Error('Approval request ID generator returned an invalid identifier') + } + if (!this.pending.has(requestId)) return requestId + } + throw new Error('Unable to allocate a unique approval request ID') + } + + private expire(requestId: string): void { + const pending = this.pending.get(requestId) + if (!pending) return + if (pending.status === 'pending') { + const decision = { allowed: false, reason: 'timeout' } as const + this.settle(pending, decision) + this.emit({ + type: 'resolved', + approval: this.toPublicSnapshot(pending), + decision + }) + } + this.deletePending(pending, 'timeout') + } + + private pruneExpired(): void { + const now = this.now() + for (const pending of Array.from(this.pending.values())) { + if (pending.expiresAt <= now) this.expire(pending.requestId) + } + } + + private attachAbort(pending: PendingApproval, signal?: AbortSignal): void { + if (!signal) return + const onAbort = () => { + if (this.pending.get(pending.requestId) !== pending) return + this.resolve({ + requestId: pending.requestId, + scopeKey: pending.scopeKey, + decision: 'cancelled' + }) + } + signal.addEventListener('abort', onAbort, { once: true }) + pending.abortCleanups.add(() => signal.removeEventListener('abort', onAbort)) + if (signal.aborted) onAbort() + } + + private settle(pending: PendingApproval, decision: ApprovalDecision): void { + for (const settle of pending.settlers) settle(decision) + pending.settlers.clear() + } + + private deletePending( + pending: PendingApproval, + reason: Extract['reason'] + ): void { + if (this.pending.get(pending.requestId) !== pending) return + clearTimeout(pending.timeout) + for (const cleanup of pending.abortCleanups) cleanup() + pending.abortCleanups.clear() + this.pending.delete(pending.requestId) + this.emit({ type: 'removed', approval: this.toPublicSnapshot(pending), reason }) + } + + private toSnapshot(pending: PendingApproval): ApprovalSnapshot { + return { + requestId: pending.requestId, + domain: pending.domain, + scopeKey: pending.scopeKey, + operation: pending.operation, + effect: pending.effect, + argumentsHash: pending.argumentsHash, + ...(pending.argumentsPreview !== undefined + ? { argumentsPreview: pending.argumentsPreview } + : {}), + ...(pending.redactedDisplayData !== undefined + ? { redactedDisplayData: cloneJsonValue(pending.redactedDisplayData) } + : {}), + status: pending.status, + expiresAt: pending.expiresAt, + metadata: pending.metadata + } + } + + private toPublicSnapshot(pending: PendingApproval): ApprovalPublicSnapshot { + const { metadata: _metadata, ...approval } = this.toSnapshot(pending) + return approval + } + + private emit(event: ApprovalEvent): void { + queueMicrotask(() => { + for (const listener of this.listeners) { + try { + listener(event) + } catch (error) { + this.log.warn('[ApprovalBroker] Subscriber failed', { + type: event.type, + domain: event.approval.domain, + operation: event.approval.operation, + failure: { name: error instanceof Error ? error.name : typeof error } + }) + } + } + }) + } +} diff --git a/src/main/approval/index.ts b/src/main/approval/index.ts new file mode 100644 index 0000000000..3dc2d43d16 --- /dev/null +++ b/src/main/approval/index.ts @@ -0,0 +1,15 @@ +export { + ApprovalBroker, + ApprovalCapacityError, + hashApprovalArguments, + type ApprovalBinding, + type ApprovalBrokerOptions, + type ApprovalCreateOptions, + type ApprovalDecision, + type ApprovalEvent, + type ApprovalMatch, + type ApprovalPublicSnapshot, + type ApprovalResolution, + type ApprovalSnapshot +} from './approvalBroker' +export { createApprovalRoutes, type ApprovalRoutesDependencies } from './routes' diff --git a/src/main/approval/routes.ts b/src/main/approval/routes.ts new file mode 100644 index 0000000000..ef5e836043 --- /dev/null +++ b/src/main/approval/routes.ts @@ -0,0 +1,28 @@ +import { approvalsResolveRoute } from '@shared/contracts/routes' +import { + createRouteMap, + requireRendererCaller, + type RendererRouteCaller +} from '@/routes/routeRegistry' + +export type ApprovalRoutesDependencies = Readonly<{ + resolve( + input: { requestId: string; decision: 'approved' | 'denied' }, + caller: RendererRouteCaller + ): boolean +}> + +export function createApprovalRoutes(dependencies: ApprovalRoutesDependencies) { + return createRouteMap([ + [ + approvalsResolveRoute.name, + async (rawInput, context) => { + const input = approvalsResolveRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) + return approvalsResolveRoute.output.parse({ + accepted: dependencies.resolve(input, caller) + }) + } + ] + ]) +} diff --git a/src/main/cli/agentCommandAccess.ts b/src/main/cli/agentCommandAccess.ts new file mode 100644 index 0000000000..9a8083371c --- /dev/null +++ b/src/main/cli/agentCommandAccess.ts @@ -0,0 +1,130 @@ +import * as fs from 'node:fs' +import path from 'node:path' +import { + CLI_COMMAND_DEFINITIONS, + cliCommandKey, + getAgentCliCommandContract +} from '@shared/contracts/cliCommands' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + type LocalControlScope +} from '@shared/contracts/localControl' +import type { CommandPermissionService } from '@/tool/permission/commandPermissionService' +import type { AgentCliTokenAuthority } from './agentTokenAuthority' +import { getCliSurfaceEntry } from './surface' + +const AGENT_CLI_COMMAND_PATTERN = /^deepchat\s+([a-z][a-z0-9-]*)\s+([a-z][a-z0-9-]*)(?:\s|$)/ +const AGENT_CLI_COMMAND_TOKEN_TTL_MS = 5 * 60_000 + +export type AgentCommandEnvironment = Readonly<{ + variables: Readonly> + prependPath: readonly string[] + preserveCommand: boolean +}> + +export type AgentCliCommandAccessOptions = Readonly<{ + tokenAuthority: Pick + commandPermission: Pick + resolveCliDirectory(): string | null +}> + +type AgentCliCommandCapability = Readonly<{ + scopes: readonly LocalControlScope[] +}> + +function createAgentCliCommandRegistry(): ReadonlyMap { + const registry = new Map() + for (const definition of CLI_COMMAND_DEFINITIONS) { + const contract = getAgentCliCommandContract(definition) + if (!contract) continue + const surface = getCliSurfaceEntry(contract.name) + if (!surface || !surface.callers.includes('agent') || surface.scopes.length === 0) { + throw new Error( + `Agent CLI command is not backed by an Agent-accessible surface: ${definition.domain} ${definition.verb}` + ) + } + registry.set(cliCommandKey(definition.domain, definition.verb), { scopes: surface.scopes }) + } + return registry +} + +const AGENT_CLI_COMMANDS = createAgentCliCommandRegistry() + +function unprivilegedAgentEnvironment(preserveCommand = false): AgentCommandEnvironment { + return { + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: [], + preserveCommand + } +} + +function localAgentEnvironment(cliDirectory: string | null): AgentCommandEnvironment { + return { + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: cliDirectory ? [cliDirectory] : [], + preserveCommand: true + } +} + +export function resolveBundledCliDirectory( + input: Readonly<{ + appPath: string + resourcesPath: string + isPackaged: boolean + platform?: NodeJS.Platform + isFile?: (filePath: string) => boolean + }> +): string | null { + const platform = input.platform ?? process.platform + const directory = input.isPackaged + ? path.join(input.resourcesPath, 'app.asar.unpacked', 'cli') + : path.join(input.appPath, 'out', 'cli') + const launcher = path.join(directory, platform === 'win32' ? 'deepchat.cmd' : 'deepchat') + if (input.isFile) return input.isFile(launcher) ? directory : null + try { + return fs.statSync(launcher).isFile() ? directory : null + } catch { + return null + } +} + +export class AgentCliCommandAccess { + constructor(private readonly options: AgentCliCommandAccessOptions) {} + + createEnvironment(conversationId: string, command: string): AgentCommandEnvironment | undefined { + const normalizedConversationId = conversationId.trim() + const normalizedCommand = command.trim() + if (!normalizedConversationId) return undefined + if (this.options.commandPermission.extractBaseCommand(normalizedCommand) !== 'deepchat') { + return unprivilegedAgentEnvironment() + } + if (normalizedCommand === 'deepchat help') { + return localAgentEnvironment(this.options.resolveCliDirectory()) + } + + const commandMatch = AGENT_CLI_COMMAND_PATTERN.exec(normalizedCommand) + if ( + this.options.commandPermission.hasShellControlSyntax(normalizedCommand) || + !commandMatch || + normalizedCommand.includes(LOCAL_CONTROL_AGENT_TOKEN_ENV) + ) { + return unprivilegedAgentEnvironment(true) + } + + const capability = AGENT_CLI_COMMANDS.get(cliCommandKey(commandMatch[1], commandMatch[2])) + if (!capability) return unprivilegedAgentEnvironment(true) + const cliDirectory = this.options.resolveCliDirectory() + if (!cliDirectory) return unprivilegedAgentEnvironment(true) + const issued = this.options.tokenAuthority.issue({ + conversationId: normalizedConversationId, + scopes: capability.scopes, + ttlMs: AGENT_CLI_COMMAND_TOKEN_TTL_MS, + maxCalls: 1 + }) + return { + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: issued.token }, + prependPath: [cliDirectory], + preserveCommand: true + } + } +} diff --git a/src/main/cli/agentTokenAuthority.ts b/src/main/cli/agentTokenAuthority.ts new file mode 100644 index 0000000000..f5b93ab252 --- /dev/null +++ b/src/main/cli/agentTokenAuthority.ts @@ -0,0 +1,330 @@ +import { createHash, randomBytes } from 'node:crypto' +import { + LocalControlScopesSchema, + LocalControlTokenSchema, + type LocalControlScope +} from '@shared/contracts/localControl' + +export const DEFAULT_AGENT_CLI_TOKEN_TTL_MS = 35 * 60_000 +export const DEFAULT_AGENT_CLI_TOKEN_MAX_CALLS = 64 +export const DEFAULT_AGENT_CLI_TOKEN_MAX_BYTES = 256 * 1024 * 1024 +export const MAX_AGENT_CLI_TOKEN_TTL_MS = 60 * 60_000 +export const MAX_AGENT_CLI_TOKEN_CALLS = 1024 +export const MAX_AGENT_CLI_TOKEN_BYTES = 1024 * 1024 * 1024 + +const DEFAULT_MAX_TOKENS = 256 +const DEFAULT_MAX_TOKENS_PER_CONVERSATION = 8 + +export type AgentCliTokenClaims = Readonly<{ + tokenId: string + conversationId: string + expiresAt: number + scopes: readonly LocalControlScope[] +}> + +export type IssuedAgentCliToken = AgentCliTokenClaims & + Readonly<{ + token: string + maxCalls: number + maxBytes: number + }> + +export type AgentCliRequestGrant = Readonly<{ + claims: AgentCliTokenClaims + signal: AbortSignal + consumeBytes(bytes: number): boolean + release(): void +}> + +export type AgentCliRequestBeginResult = + | Readonly<{ status: 'granted'; grant: AgentCliRequestGrant }> + | Readonly<{ status: 'invalid' | 'expired' | 'quota-exhausted' }> + +export type AgentCliTokenAuthorityOptions = Readonly<{ + now?: () => number + createToken?: () => string + createTokenId?: () => string + maxTokens?: number + maxTokensPerConversation?: number +}> + +type TokenRecord = { + digest: string + claims: AgentCliTokenClaims + maxCalls: number + maxBytes: number + usedCalls: number + usedBytes: number + activeRequests: number + issuedAt: number + controller: AbortController + expiryTimer: NodeJS.Timeout +} + +function positiveSafeInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value <= 0) { + throw new Error(`${name} must be a positive safe integer`) + } + return value +} + +function boundedPositiveSafeInteger(value: number, maximum: number, name: string): number { + const normalized = positiveSafeInteger(value, name) + if (normalized > maximum) throw new Error(`${name} exceeds its supported maximum`) + return normalized +} + +function tokenDigest(token: string): string { + return createHash('sha256').update(token).digest('hex') +} + +function normalizeConversationId(value: string): string { + const normalized = value.trim() + if (normalized.length === 0 || normalized.length > 128) { + throw new Error('conversationId must contain 1 to 128 characters') + } + return normalized +} + +export class AgentCliTokenCapacityError extends Error { + constructor() { + super('Agent CLI token capacity is exhausted') + this.name = 'AgentCliTokenCapacityError' + } +} + +export class AgentCliTokenAuthority { + private readonly now: () => number + private readonly createToken: () => string + private readonly createTokenId: () => string + private readonly maxTokens: number + private readonly maxTokensPerConversation: number + private readonly recordsByDigest = new Map() + private readonly recordsById = new Map() + private readonly digestsByConversation = new Map>() + + constructor(options: AgentCliTokenAuthorityOptions = {}) { + this.now = options.now ?? Date.now + this.createToken = options.createToken ?? (() => randomBytes(32).toString('base64url')) + this.createTokenId = options.createTokenId ?? (() => randomBytes(16).toString('base64url')) + this.maxTokens = positiveSafeInteger(options.maxTokens ?? DEFAULT_MAX_TOKENS, 'maxTokens') + this.maxTokensPerConversation = positiveSafeInteger( + options.maxTokensPerConversation ?? DEFAULT_MAX_TOKENS_PER_CONVERSATION, + 'maxTokensPerConversation' + ) + } + + issue( + input: Readonly<{ + conversationId: string + scopes: readonly LocalControlScope[] + ttlMs?: number + maxCalls?: number + maxBytes?: number + }> + ): IssuedAgentCliToken { + const conversationId = normalizeConversationId(input.conversationId) + const scopes = LocalControlScopesSchema.parse([...input.scopes]) + if (scopes.length === 0) throw new Error('scopes must contain at least one capability') + const ttlMs = boundedPositiveSafeInteger( + input.ttlMs ?? DEFAULT_AGENT_CLI_TOKEN_TTL_MS, + MAX_AGENT_CLI_TOKEN_TTL_MS, + 'ttlMs' + ) + const maxCalls = boundedPositiveSafeInteger( + input.maxCalls ?? DEFAULT_AGENT_CLI_TOKEN_MAX_CALLS, + MAX_AGENT_CLI_TOKEN_CALLS, + 'maxCalls' + ) + const maxBytes = boundedPositiveSafeInteger( + input.maxBytes ?? DEFAULT_AGENT_CLI_TOKEN_MAX_BYTES, + MAX_AGENT_CLI_TOKEN_BYTES, + 'maxBytes' + ) + const issuedAt = this.now() + if (issuedAt > Number.MAX_SAFE_INTEGER - ttlMs) { + throw new Error('Agent CLI token expiry is outside the supported range') + } + this.pruneRetired(issuedAt) + const replacesConversationToken = + (this.digestsByConversation.get(conversationId)?.size ?? 0) >= this.maxTokensPerConversation + if (this.recordsByDigest.size >= this.maxTokens && !replacesConversationToken) { + throw new AgentCliTokenCapacityError() + } + const token = LocalControlTokenSchema.parse(this.createUniqueToken()) + const tokenId = this.createUniqueTokenId() + if (replacesConversationToken) this.enforceConversationCapacity(conversationId) + if (this.recordsByDigest.size >= this.maxTokens) { + throw new AgentCliTokenCapacityError() + } + const expiresAt = issuedAt + ttlMs + const claims: AgentCliTokenClaims = { + tokenId, + conversationId, + expiresAt, + scopes + } + const digest = tokenDigest(token) + const controller = new AbortController() + const expiryTimer = setTimeout(() => this.removeRecord(digest, 'expired'), ttlMs) + expiryTimer.unref() + const record: TokenRecord = { + digest, + claims, + maxCalls, + maxBytes, + usedCalls: 0, + usedBytes: 0, + activeRequests: 0, + issuedAt, + controller, + expiryTimer + } + this.recordsByDigest.set(digest, record) + this.recordsById.set(tokenId, record) + const conversationTokens = this.digestsByConversation.get(conversationId) ?? new Set() + conversationTokens.add(digest) + this.digestsByConversation.set(conversationId, conversationTokens) + + return { token, ...claims, maxCalls, maxBytes } + } + + beginRequest(token: string): AgentCliRequestBeginResult { + const parsedToken = LocalControlTokenSchema.safeParse(token) + if (!parsedToken.success) return { status: 'invalid' } + const digest = tokenDigest(parsedToken.data) + const record = this.recordsByDigest.get(digest) + if (!record) return { status: 'invalid' } + if (record.claims.expiresAt <= this.now()) { + this.removeRecord(digest, 'expired') + return { status: 'expired' } + } + if (record.usedCalls >= record.maxCalls || record.usedBytes >= record.maxBytes) { + return { status: 'quota-exhausted' } + } + + record.usedCalls += 1 + record.activeRequests += 1 + let released = false + return { + status: 'granted', + grant: { + claims: record.claims, + signal: record.controller.signal, + consumeBytes: (bytes) => this.consumeRecordBytes(record, bytes), + release: () => { + if (released) return + released = true + record.activeRequests = Math.max(0, record.activeRequests - 1) + } + } + } + } + + consumeBytes(tokenId: string, bytes: number): boolean { + const record = this.recordsById.get(tokenId) + return record ? this.consumeRecordBytes(record, bytes) : false + } + + revokeConversation(conversationId: string): void { + const normalized = conversationId.trim() + if (!normalized) return + for (const digest of this.digestsByConversation.get(normalized) ?? []) { + this.removeRecord(digest, 'revoked') + } + } + + clear(): void { + for (const digest of this.recordsByDigest.keys()) { + this.removeRecord(digest, 'revoked') + } + } + + snapshot(): Readonly<{ tokens: number; conversations: number }> { + this.pruneRetired(this.now()) + return { + tokens: this.recordsByDigest.size, + conversations: this.digestsByConversation.size + } + } + + private createUniqueToken(): string { + for (let attempt = 0; attempt < 8; attempt += 1) { + const candidate = this.createToken() + if (!this.recordsByDigest.has(tokenDigest(candidate))) return candidate + } + throw new Error('Failed to allocate a unique Agent CLI token') + } + + private createUniqueTokenId(): string { + for (let attempt = 0; attempt < 8; attempt += 1) { + const candidate = this.createTokenId() + if (/^[A-Za-z0-9_-]{16,128}$/.test(candidate) && !this.recordsById.has(candidate)) { + return candidate + } + } + throw new Error('Failed to allocate a unique Agent CLI token ID') + } + + private consumeRecordBytes(record: TokenRecord, bytes: number): boolean { + if (!Number.isSafeInteger(bytes) || bytes < 0) { + throw new Error('Agent CLI byte usage must be a non-negative safe integer') + } + if (this.recordsByDigest.get(record.digest) !== record) return false + if (record.claims.expiresAt <= this.now()) { + this.removeRecord(record.digest, 'expired') + return false + } + if (bytes > record.maxBytes - record.usedBytes) { + record.usedBytes = record.maxBytes + return false + } + record.usedBytes += bytes + return true + } + + private enforceConversationCapacity(conversationId: string): void { + const conversationTokens = this.digestsByConversation.get(conversationId) + if (!conversationTokens || conversationTokens.size < this.maxTokensPerConversation) return + const oldest = [...conversationTokens] + .map((digest) => this.recordsByDigest.get(digest)) + .filter((record): record is TokenRecord => Boolean(record)) + .sort( + (left, right) => + left.issuedAt - right.issuedAt || left.claims.tokenId.localeCompare(right.claims.tokenId) + )[0] + if (oldest) this.removeRecord(oldest.digest, 'replaced') + } + + private pruneRetired(now: number): void { + for (const record of this.recordsByDigest.values()) { + if (record.claims.expiresAt <= now) { + this.removeRecord(record.digest, 'expired') + continue + } + if ( + record.activeRequests === 0 && + (record.usedCalls >= record.maxCalls || record.usedBytes >= record.maxBytes) + ) { + this.removeRecord(record.digest, 'exhausted') + } + } + } + + private removeRecord( + digest: string, + reason: 'expired' | 'exhausted' | 'replaced' | 'revoked' + ): void { + const record = this.recordsByDigest.get(digest) + if (!record) return + this.recordsByDigest.delete(digest) + this.recordsById.delete(record.claims.tokenId) + const conversationTokens = this.digestsByConversation.get(record.claims.conversationId) + conversationTokens?.delete(digest) + if (conversationTokens?.size === 0) { + this.digestsByConversation.delete(record.claims.conversationId) + } + clearTimeout(record.expiryTimer) + record.controller.abort(new Error(`Agent CLI token ${reason}`)) + } +} diff --git a/src/main/cli/artifactRoutes.ts b/src/main/cli/artifactRoutes.ts new file mode 100644 index 0000000000..63cf017026 --- /dev/null +++ b/src/main/cli/artifactRoutes.ts @@ -0,0 +1,62 @@ +import { + artifactsDeleteRoute, + artifactsDescribeRoute, + artifactsReadRoute +} from '@shared/contracts/routes' +import { + createRouteMap, + type CliRouteCaller, + type DeepchatRouteMap, + type RouteCaller +} from '@/routes/routeRegistry' +import { ArtifactSpool } from './artifactSpool' +import { CliRequestError } from './errors' + +function requireCliCaller(caller: RouteCaller): CliRouteCaller { + if (caller.kind !== 'cli') { + throw new CliRequestError('permission_denied', 'Artifact routes require a CLI caller', { + httpStatus: 403 + }) + } + return caller +} + +export function createArtifactRoutes(artifactSpool: ArtifactSpool): DeepchatRouteMap { + return createRouteMap([ + [ + artifactsDescribeRoute.name, + async (rawInput, context) => { + const input = artifactsDescribeRoute.input.parse(rawInput) + const caller = requireCliCaller(context.caller) + return artifactsDescribeRoute.output.parse({ + artifact: await artifactSpool.describe(input.id, caller) + }) + } + ], + // The RPC route is a metadata preflight; bytes use the streamed download endpoint. + [ + artifactsReadRoute.name, + async (rawInput, context) => { + const input = artifactsReadRoute.input.parse(rawInput) + const caller = requireCliCaller(context.caller) + return artifactsReadRoute.output.parse({ + artifact: await artifactSpool.describe(input.id, caller) + }) + } + ], + [ + artifactsDeleteRoute.name, + async (rawInput, context) => { + const input = artifactsDeleteRoute.input.parse(rawInput) + const caller = requireCliCaller(context.caller) + if (caller.principal !== 'human') { + throw new CliRequestError('permission_denied', 'Agent callers cannot delete artifacts', { + httpStatus: 403 + }) + } + await artifactSpool.delete(input.id, caller) + return artifactsDeleteRoute.output.parse({ deleted: true }) + } + ] + ]) +} diff --git a/src/main/cli/artifactSpool.ts b/src/main/cli/artifactSpool.ts new file mode 100644 index 0000000000..55f72ec02e --- /dev/null +++ b/src/main/cli/artifactSpool.ts @@ -0,0 +1,800 @@ +import { createHash, randomBytes } from 'node:crypto' +import type { ReadStream } from 'node:fs' +import type { FileHandle } from 'node:fs/promises' +import { chmod, link, lstat, mkdir, open, readdir, unlink } from 'node:fs/promises' +import path from 'node:path' +import { + ArtifactMetadataSchema, + type ArtifactMetadata +} from '@shared/contracts/routes/artifacts.routes' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import { CliRequestError } from './errors' + +const DEFAULT_ARTIFACT_TTL_MS = 60 * 60_000 +const MAX_ARTIFACT_TTL_MS = 7 * 24 * 60 * 60_000 +const DEFAULT_CLEANUP_INTERVAL_MS = 60_000 +const OWNED_FILE_PATTERN = /^(?:\.[A-Za-z0-9_-]{16,128}\.tmp|[A-Za-z0-9_-]{16,128}\.artifact)$/ + +export type ArtifactSpoolLimits = Readonly<{ + maxArtifactBytes: number + maxRequestBytes: number + maxConnectionBytes: number + maxOwnerBytes: number + maxTotalBytes: number + maxRequestCount: number + maxConnectionCount: number + maxOwnerCount: number + maxTotalCount: number +}> + +const DEFAULT_LIMITS: ArtifactSpoolLimits = { + maxArtifactBytes: 512 * 1024 * 1024, + maxRequestBytes: 768 * 1024 * 1024, + maxConnectionBytes: 1024 * 1024 * 1024, + maxOwnerBytes: 1024 * 1024 * 1024, + maxTotalBytes: 2 * 1024 * 1024 * 1024, + maxRequestCount: 16, + maxConnectionCount: 64, + maxOwnerCount: 128, + maxTotalCount: 256 +} + +type ArtifactOwner = Readonly<{ + principal: 'human' | 'agent' + conversationId?: string +}> + +type StoredArtifact = Readonly<{ + metadata: ArtifactMetadata + filePath: string + ownerKey: string + requestKey: string + connectionId: string +}> + +type QuotaReservation = { + bytes: number + count: number +} + +export type ArtifactWriteInput = Readonly<{ + caller: CliRouteCaller + requestId: string + mimeType: string + suggestedFilename?: string + data: Uint8Array | AsyncIterable + ttlMs?: number + signal?: AbortSignal +}> + +export type OpenArtifact = Readonly<{ + metadata: ArtifactMetadata + stream: ReadStream +}> + +export type ArtifactInputFile = Readonly<{ + metadata: ArtifactMetadata + path: string +}> + +type OpenArtifactHandle = Readonly<{ + artifact: StoredArtifact + handle: FileHandle + release: () => void +}> + +export type ArtifactSpoolOptions = Readonly<{ + directory: string + limits?: Partial + consumeAgentBytes?: (tokenId: string, bytes: number) => boolean + now?: () => number + createId?: () => string + cleanupIntervalMs?: number + log?: Pick +}> + +function ownerForCaller(caller: CliRouteCaller): ArtifactOwner { + return caller.principal === 'human' + ? { principal: 'human' } + : { principal: 'agent', conversationId: caller.conversationId } +} + +function ownerKey(owner: ArtifactOwner): string { + return owner.principal === 'human' ? 'human' : `agent:${owner.conversationId ?? ''}` +} + +function requestKey(owner: string, requestId: string): string { + return JSON.stringify([owner, requestId]) +} + +function normalizeMimeType(value: string): string { + return ArtifactMetadataSchema.shape.mimeType.parse(value.trim().toLowerCase()) +} + +export function artifactExtensionForMimeType(mimeType: string): string { + switch (mimeType.split(';', 1)[0]) { + case 'image/png': + return '.png' + case 'image/jpeg': + return '.jpg' + case 'image/webp': + return '.webp' + case 'image/gif': + return '.gif' + case 'image/avif': + return '.avif' + case 'video/mp4': + return '.mp4' + case 'video/webm': + return '.webm' + case 'audio/mpeg': + return '.mp3' + case 'audio/wav': + return '.wav' + case 'audio/ogg': + return '.ogg' + case 'audio/aac': + return '.aac' + case 'audio/flac': + return '.flac' + case 'audio/pcm': + return '.pcm' + default: + return '.bin' + } +} + +function normalizeFilename(value: string | undefined, mimeType: string): string { + const sanitized = Buffer.from(value ?? '', 'utf8') + .toString('utf8') + .normalize('NFC') + .replace(/[\\/]/g, '_') + .replace(/\p{Cc}/gu, '_') + .trim() + let normalized = '' + for (const character of sanitized) { + if (normalized.length + character.length > 255) break + normalized += character + } + return normalized && normalized !== '.' && normalized !== '..' + ? normalized + : `artifact${artifactExtensionForMimeType(mimeType)}` +} + +function positiveInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value <= 0) { + throw new Error(`${name} must be a positive safe integer`) + } + return value +} + +async function writeAll(handle: FileHandle, bytes: Uint8Array, position: number): Promise { + let offset = 0 + while (offset < bytes.byteLength) { + const { bytesWritten } = await handle.write( + bytes, + offset, + bytes.byteLength - offset, + position + offset + ) + if (bytesWritten <= 0) throw new Error('Artifact output write made no progress') + offset += bytesWritten + } + return position + bytes.byteLength +} + +function throwIfArtifactWriteCancelled(signal: AbortSignal | undefined): void { + if (signal?.aborted) { + throw new CliRequestError('cancelled', 'Artifact output was cancelled') + } +} + +async function* artifactChunks( + data: Uint8Array | AsyncIterable +): AsyncGenerator { + if (data instanceof Uint8Array) { + yield data + return + } + for await (const chunk of data) { + if (!(chunk instanceof Uint8Array)) { + throw new CliRequestError('invalid_request', 'Artifact stream yielded a non-byte chunk') + } + yield chunk + } +} + +export class ArtifactSpool { + private readonly limits: ArtifactSpoolLimits + private readonly now: () => number + private readonly createId: () => string + private readonly cleanupIntervalMs: number + private readonly log: Pick + private readonly artifacts = new Map() + private readonly storedOwnerUsage = new Map() + private readonly storedRequestUsage = new Map() + private readonly storedConnectionUsage = new Map() + private readonly ownerReservations = new Map() + private readonly requestReservations = new Map() + private readonly connectionReservations = new Map() + private readonly allocatedIds = new Set() + private storedBytes = 0 + private reservedBytes = 0 + private reservedCount = 0 + private activeWrites = 0 + private readonly activeReads = new Map() + private readonly openReadStreams = new Set() + private readonly pendingRemovalIds = new Set() + private readonly removalPromises = new Map>() + private readonly writeDrainListeners = new Set<() => void>() + private readonly readDrainListeners = new Set<() => void>() + private closing = false + private initializePromise: Promise | undefined + private closePromise: Promise | undefined + private cleanupTimer: NodeJS.Timeout | undefined + + constructor(private readonly options: ArtifactSpoolOptions) { + this.limits = { + ...DEFAULT_LIMITS, + ...options.limits + } + for (const [name, value] of Object.entries(this.limits)) positiveInteger(value, name) + this.now = options.now ?? Date.now + this.createId = options.createId ?? (() => randomBytes(24).toString('base64url')) + this.cleanupIntervalMs = positiveInteger( + options.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS, + 'cleanupIntervalMs' + ) + this.log = options.log ?? console + } + + async initialize(): Promise { + if (this.closing) { + throw new CliRequestError('unavailable', 'Artifact spool is closed', { httpStatus: 503 }) + } + if (this.initializePromise) return await this.initializePromise + this.initializePromise = this.initializeInternal().catch((error) => { + this.initializePromise = undefined + throw error + }) + return await this.initializePromise + } + + private async initializeInternal(): Promise { + await mkdir(this.options.directory, { recursive: true, mode: 0o700 }) + const directoryStat = await lstat(this.options.directory) + if (!directoryStat.isDirectory() || directoryStat.isSymbolicLink()) { + throw new Error('Artifact spool path is not a regular directory') + } + if (typeof process.getuid === 'function' && directoryStat.uid !== process.getuid()) { + throw new Error('Artifact spool directory is owned by another user') + } + if (process.platform !== 'win32') { + await chmod(this.options.directory, 0o700) + const protectedStat = await lstat(this.options.directory) + if ((protectedStat.mode & 0o077) !== 0) { + throw new Error('Artifact spool directory permissions are not private') + } + } + + for (const entry of await readdir(this.options.directory, { withFileTypes: true })) { + if (!OWNED_FILE_PATTERN.test(entry.name)) continue + if (entry.isFile() || entry.isSymbolicLink()) { + await unlink(path.join(this.options.directory, entry.name)) + } + } + + this.cleanupTimer = setInterval(() => { + void this.cleanupExpired().catch((error) => { + this.log.warn('[CLI] Failed to clean expired artifacts', error) + }) + }, this.cleanupIntervalMs) + this.cleanupTimer.unref() + } + + async write(input: ArtifactWriteInput): Promise { + if (this.closing) { + throw new CliRequestError('unavailable', 'Artifact spool is closed', { httpStatus: 503 }) + } + this.activeWrites += 1 + try { + return await this.writeInternal(input) + } finally { + this.activeWrites = Math.max(0, this.activeWrites - 1) + if (this.activeWrites === 0) { + for (const listener of this.writeDrainListeners) listener() + this.writeDrainListeners.clear() + } + } + } + + private async writeInternal(input: ArtifactWriteInput): Promise { + throwIfArtifactWriteCancelled(input.signal) + await this.initialize() + const owner = ownerForCaller(input.caller) + const ownerQuotaKey = ownerKey(owner) + const requestQuotaKey = requestKey(ownerQuotaKey, input.requestId) + const connectionQuotaKey = input.caller.connectionId + const mimeType = normalizeMimeType(input.mimeType) + const requestId = ArtifactMetadataSchema.shape.requestId.parse(input.requestId) + const filename = normalizeFilename(input.suggestedFilename, mimeType) + const ttlMs = positiveInteger(input.ttlMs ?? DEFAULT_ARTIFACT_TTL_MS, 'ttlMs') + if (ttlMs > MAX_ARTIFACT_TTL_MS) { + throw new Error('Artifact expiry is outside the supported range') + } + this.reserveArtifact(ownerQuotaKey, requestQuotaKey, connectionQuotaKey) + + let id = '' + let tempPath = '' + let finalPath = '' + let published = false + let size = 0 + let reservedSize = 0 + try { + id = this.allocateId() + tempPath = path.join(this.options.directory, `.${id}.tmp`) + finalPath = path.join(this.options.directory, `${id}.artifact`) + let metadata: ArtifactMetadata + const handle = await open(tempPath, 'wx', 0o600) + try { + const hash = createHash('sha256') + let position = 0 + for await (const chunk of artifactChunks(input.data)) { + throwIfArtifactWriteCancelled(input.signal) + if (chunk.byteLength === 0) continue + if (chunk.byteLength > this.limits.maxArtifactBytes - size) { + throw new CliRequestError( + 'body_too_large', + 'Artifact exceeds the per-file byte limit', + { + httpStatus: 413 + } + ) + } + if ( + input.caller.principal === 'agent' && + !this.options.consumeAgentBytes?.(input.caller.tokenId, chunk.byteLength) + ) { + throw new CliRequestError('rate_limited', 'Agent CLI token byte quota is exhausted', { + httpStatus: 429 + }) + } + this.reserveBytes(ownerQuotaKey, requestQuotaKey, connectionQuotaKey, chunk.byteLength) + reservedSize += chunk.byteLength + position = await writeAll(handle, chunk, position) + size += chunk.byteLength + hash.update(chunk) + } + throwIfArtifactWriteCancelled(input.signal) + if (size === 0) { + throw new CliRequestError('invalid_request', 'Artifact output is empty') + } + await handle.sync() + throwIfArtifactWriteCancelled(input.signal) + const createdAt = this.now() + if (createdAt > Number.MAX_SAFE_INTEGER - ttlMs) { + throw new Error('Artifact expiry is outside the supported range') + } + metadata = ArtifactMetadataSchema.parse({ + id, + requestId, + owner: owner.principal, + mimeType, + size, + sha256: hash.digest('hex'), + filename, + createdAt, + expiresAt: createdAt + ttlMs + }) + } finally { + await handle.close() + } + throwIfArtifactWriteCancelled(input.signal) + if (process.platform !== 'win32') await chmod(tempPath, 0o600) + throwIfArtifactWriteCancelled(input.signal) + await link(tempPath, finalPath) + published = true + throwIfArtifactWriteCancelled(input.signal) + await unlink(tempPath) + tempPath = '' + throwIfArtifactWriteCancelled(input.signal) + this.recordStoredArtifact({ + metadata, + filePath: finalPath, + ownerKey: ownerQuotaKey, + requestKey: requestQuotaKey, + connectionId: connectionQuotaKey + }) + return metadata + } catch (error) { + if (tempPath) await unlink(tempPath).catch(() => undefined) + if (published && finalPath) await unlink(finalPath).catch(() => undefined) + throw error + } finally { + if (id) this.allocatedIds.delete(id) + this.releaseReservation(ownerQuotaKey, requestQuotaKey, connectionQuotaKey, reservedSize) + } + } + + async describe(id: string, caller: CliRouteCaller): Promise { + await this.initialize() + const artifact = await this.getAuthorizedArtifact(id, caller) + return artifact.metadata + } + + async openRead(id: string, caller: CliRouteCaller): Promise { + const opened = await this.openAuthorizedHandle(id, caller) + try { + let stream: ReadStream + try { + stream = opened.handle.createReadStream({ autoClose: true }) + } catch (error) { + await opened.handle.close().catch(() => undefined) + throw error + } + this.openReadStreams.add(stream) + stream.once('close', () => { + this.openReadStreams.delete(stream) + opened.release() + }) + if (this.closing) stream.destroy() + return { metadata: opened.artifact.metadata, stream } + } catch (error) { + opened.release() + throw error + } + } + + async withFile( + id: string, + caller: CliRouteCaller, + operation: (file: ArtifactInputFile) => Promise + ): Promise { + const opened = await this.openAuthorizedHandle(id, caller) + try { + return await operation({ + metadata: opened.artifact.metadata, + path: opened.artifact.filePath + }) + } finally { + await opened.handle.close().catch(() => undefined) + opened.release() + } + } + + async delete(id: string, caller: CliRouteCaller): Promise { + await this.initialize() + const artifact = await this.getAuthorizedArtifact(id, caller) + await this.removeStoredArtifact(artifact, 'reject') + } + + async discard(id: string): Promise { + await this.initialize() + const artifact = this.artifacts.get(id) + if (artifact) await this.removeStoredArtifact(artifact) + } + + async cleanupExpired(): Promise { + if (this.closing) return + await this.initialize() + const now = this.now() + const expired = Array.from(this.artifacts.values()).filter( + (artifact) => artifact.metadata.expiresAt <= now + ) + await Promise.all(expired.map((artifact) => this.removeStoredArtifact(artifact))) + } + + async close(): Promise { + if (this.closePromise) return await this.closePromise + this.closing = true + this.closePromise = this.closeInternal() + return await this.closePromise + } + + private async closeInternal(): Promise { + if (this.initializePromise) await this.initializePromise.catch(() => undefined) + if (this.activeWrites > 0) { + await new Promise((resolve) => this.writeDrainListeners.add(resolve)) + } + for (const stream of this.openReadStreams) stream.destroy() + if (this.activeReads.size > 0) { + await new Promise((resolve) => this.readDrainListeners.add(resolve)) + } + if (this.cleanupTimer) clearInterval(this.cleanupTimer) + this.cleanupTimer = undefined + await Promise.all( + Array.from(this.artifacts.values()).map((artifact) => this.removeStoredArtifact(artifact)) + ) + this.artifacts.clear() + this.activeReads.clear() + this.openReadStreams.clear() + this.pendingRemovalIds.clear() + this.removalPromises.clear() + this.storedOwnerUsage.clear() + this.storedRequestUsage.clear() + this.storedConnectionUsage.clear() + this.ownerReservations.clear() + this.requestReservations.clear() + this.connectionReservations.clear() + this.allocatedIds.clear() + this.storedBytes = 0 + this.reservedBytes = 0 + this.reservedCount = 0 + } + + private allocateId(): string { + for (let attempt = 0; attempt < 8; attempt += 1) { + const id = this.createId() + if (!/^[A-Za-z0-9_-]{16,128}$/.test(id)) { + throw new Error('Artifact ID generator returned an invalid identifier') + } + if (!this.artifacts.has(id) && !this.allocatedIds.has(id)) { + this.allocatedIds.add(id) + return id + } + } + throw new Error('Unable to allocate a unique artifact ID') + } + + private reserveArtifact(owner: string, request: string, connection: string): void { + if ( + this.quotaUsage(this.storedOwnerUsage, this.ownerReservations, owner).count + 1 > + this.limits.maxOwnerCount || + this.quotaUsage(this.storedRequestUsage, this.requestReservations, request).count + 1 > + this.limits.maxRequestCount || + this.quotaUsage(this.storedConnectionUsage, this.connectionReservations, connection).count + + 1 > + this.limits.maxConnectionCount || + this.artifacts.size + this.reservedCount + 1 > this.limits.maxTotalCount + ) { + throw this.quotaError() + } + this.addQuotaUsage(this.ownerReservations, owner, 0, 1) + this.addQuotaUsage(this.requestReservations, request, 0, 1) + this.addQuotaUsage(this.connectionReservations, connection, 0, 1) + this.reservedCount += 1 + } + + private reserveBytes(owner: string, request: string, connection: string, bytes: number): void { + if ( + this.quotaUsage(this.storedOwnerUsage, this.ownerReservations, owner).bytes + bytes > + this.limits.maxOwnerBytes || + this.quotaUsage(this.storedRequestUsage, this.requestReservations, request).bytes + bytes > + this.limits.maxRequestBytes || + this.quotaUsage(this.storedConnectionUsage, this.connectionReservations, connection).bytes + + bytes > + this.limits.maxConnectionBytes || + this.storedBytes + this.reservedBytes + bytes > this.limits.maxTotalBytes + ) { + throw this.quotaError() + } + this.addQuotaUsage(this.ownerReservations, owner, bytes, 0) + this.addQuotaUsage(this.requestReservations, request, bytes, 0) + this.addQuotaUsage(this.connectionReservations, connection, bytes, 0) + this.reservedBytes += bytes + } + + private quotaUsage( + storedUsage: ReadonlyMap, + reservations: ReadonlyMap, + key: string + ): QuotaReservation { + const stored = storedUsage.get(key) + const reserved = reservations.get(key) + return { + bytes: (stored?.bytes ?? 0) + (reserved?.bytes ?? 0), + count: (stored?.count ?? 0) + (reserved?.count ?? 0) + } + } + + private addQuotaUsage( + usageByKey: Map, + key: string, + bytes: number, + count: number + ): void { + const usage = usageByKey.get(key) ?? { bytes: 0, count: 0 } + usage.bytes += bytes + usage.count += count + usageByKey.set(key, usage) + } + + private releaseReservation( + owner: string, + request: string, + connection: string, + bytes: number + ): void { + this.subtractQuotaUsage(this.ownerReservations, owner, bytes, 1) + this.subtractQuotaUsage(this.requestReservations, request, bytes, 1) + this.subtractQuotaUsage(this.connectionReservations, connection, bytes, 1) + this.reservedBytes = Math.max(0, this.reservedBytes - bytes) + this.reservedCount = Math.max(0, this.reservedCount - 1) + } + + private subtractQuotaUsage( + usageByKey: Map, + key: string, + bytes: number, + count: number + ): void { + const usage = usageByKey.get(key) + if (!usage) return + usage.bytes = Math.max(0, usage.bytes - bytes) + usage.count = Math.max(0, usage.count - count) + if (usage.bytes === 0 && usage.count === 0) usageByKey.delete(key) + } + + private recordStoredArtifact(artifact: StoredArtifact): void { + const id = artifact.metadata.id + if (this.artifacts.has(id)) throw new Error('Artifact ID is already stored') + this.artifacts.set(id, artifact) + this.addQuotaUsage(this.storedOwnerUsage, artifact.ownerKey, artifact.metadata.size, 1) + this.addQuotaUsage(this.storedRequestUsage, artifact.requestKey, artifact.metadata.size, 1) + this.addQuotaUsage(this.storedConnectionUsage, artifact.connectionId, artifact.metadata.size, 1) + this.storedBytes += artifact.metadata.size + } + + private forgetStoredArtifact(artifact: StoredArtifact): void { + const id = artifact.metadata.id + if (this.artifacts.get(id) !== artifact) return + this.artifacts.delete(id) + this.subtractQuotaUsage(this.storedOwnerUsage, artifact.ownerKey, artifact.metadata.size, 1) + this.subtractQuotaUsage(this.storedRequestUsage, artifact.requestKey, artifact.metadata.size, 1) + this.subtractQuotaUsage( + this.storedConnectionUsage, + artifact.connectionId, + artifact.metadata.size, + 1 + ) + this.storedBytes = Math.max(0, this.storedBytes - artifact.metadata.size) + } + + private quotaError(): CliRequestError { + return new CliRequestError('rate_limited', 'Artifact spool quota is exhausted', { + httpStatus: 429, + retriable: true + }) + } + + private async getAuthorizedArtifact(id: string, caller: CliRouteCaller): Promise { + const artifact = this.artifacts.get(id) + if (!artifact || this.pendingRemovalIds.has(id) || this.removalPromises.has(id)) { + throw new CliRequestError('not_found', 'Artifact was not found', { httpStatus: 404 }) + } + if (artifact.metadata.expiresAt <= this.now()) { + await this.removeStoredArtifact(artifact) + throw new CliRequestError('not_found', 'Artifact has expired', { httpStatus: 404 }) + } + if (caller.principal === 'agent' && artifact.ownerKey !== ownerKey(ownerForCaller(caller))) { + throw new CliRequestError('permission_denied', 'Artifact belongs to another caller', { + httpStatus: 403 + }) + } + return artifact + } + + private async openAuthorizedHandle( + id: string, + caller: CliRouteCaller + ): Promise { + await this.initialize() + const artifact = await this.getAuthorizedArtifact(id, caller) + const release = this.acquireRead(artifact) + try { + const fileStat = await lstat(artifact.filePath).catch(() => null) + if ( + !fileStat?.isFile() || + fileStat.isSymbolicLink() || + fileStat.size !== artifact.metadata.size + ) { + await this.removeStoredArtifact(artifact).catch((error) => { + this.log.warn('[CLI] Failed to remove invalid artifact', error) + }) + throw new CliRequestError('unavailable', 'Artifact data is unavailable', { + httpStatus: 410 + }) + } + const handle = await open(artifact.filePath, 'r').catch(async () => { + await this.removeStoredArtifact(artifact).catch((error) => { + this.log.warn('[CLI] Failed to remove unavailable artifact', error) + }) + throw new CliRequestError('unavailable', 'Artifact data is unavailable', { + httpStatus: 410 + }) + }) + const openedStat = await handle.stat().catch(() => null) + if ( + !openedStat?.isFile() || + openedStat.size !== artifact.metadata.size || + openedStat.dev !== fileStat.dev || + openedStat.ino !== fileStat.ino + ) { + await handle.close().catch(() => undefined) + await this.removeStoredArtifact(artifact).catch((error) => { + this.log.warn('[CLI] Failed to remove changed artifact', error) + }) + throw new CliRequestError('unavailable', 'Artifact data changed before it could be read', { + httpStatus: 410 + }) + } + if (this.closing) { + await handle.close().catch(() => undefined) + throw new CliRequestError('unavailable', 'Artifact spool is closed', { httpStatus: 503 }) + } + return { artifact, handle, release } + } catch (error) { + release() + throw error + } + } + + private acquireRead(artifact: StoredArtifact): () => void { + const id = artifact.metadata.id + if ( + this.artifacts.get(id) !== artifact || + this.pendingRemovalIds.has(id) || + this.removalPromises.has(id) + ) { + throw new CliRequestError('not_found', 'Artifact was not found', { httpStatus: 404 }) + } + this.activeReads.set(id, (this.activeReads.get(id) ?? 0) + 1) + let released = false + return () => { + if (released) return + released = true + const remaining = Math.max(0, (this.activeReads.get(id) ?? 1) - 1) + if (remaining > 0) { + this.activeReads.set(id, remaining) + return + } + this.activeReads.delete(id) + if (this.pendingRemovalIds.delete(id)) { + const current = this.artifacts.get(id) + if (current) { + void this.removeStoredArtifact(current).catch((error) => { + this.log.warn('[CLI] Failed to remove released artifact', error) + }) + } + } + if (this.activeReads.size === 0) { + for (const listener of this.readDrainListeners) listener() + this.readDrainListeners.clear() + } + } + } + + private async removeStoredArtifact( + artifact: StoredArtifact, + activeReadBehavior: 'defer' | 'reject' = 'defer' + ): Promise { + if (this.artifacts.get(artifact.metadata.id) !== artifact) return + const id = artifact.metadata.id + const existingRemoval = this.removalPromises.get(id) + if (existingRemoval) return await existingRemoval + if ((this.activeReads.get(id) ?? 0) > 0) { + if (activeReadBehavior === 'reject') { + throw new CliRequestError('conflict', 'Artifact is currently in use', { + httpStatus: 409, + retriable: true + }) + } + this.pendingRemovalIds.add(id) + return + } + + const removal = (async () => { + await unlink(artifact.filePath).catch((error) => { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + }) + this.forgetStoredArtifact(artifact) + this.pendingRemovalIds.delete(id) + })() + this.removalPromises.set(id, removal) + try { + await removal + } finally { + if (this.removalPromises.get(id) === removal) this.removalPromises.delete(id) + } + } +} diff --git a/src/main/cli/audioTranscriptionService.ts b/src/main/cli/audioTranscriptionService.ts new file mode 100644 index 0000000000..8be6771f05 --- /dev/null +++ b/src/main/cli/audioTranscriptionService.ts @@ -0,0 +1,243 @@ +import { readFile } from 'node:fs/promises' +import { + AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES, + AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS, + AudioInputMimeTypeSchema, + AudioTranscriptionOutputSchema, + audioTranscribeArtifactRoute, + audioTranscribeUploadRoute, + type AudioTranscriptionArtifactInput, + type AudioTranscriptionOutput, + type AudioTranscriptionUploadInput +} from '@shared/contracts/routes' +import type { ProviderRuntime } from '@/provider' +import type { ProviderSettingsPort } from '@/provider/settings' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import type { ArtifactSpool } from './artifactSpool' +import { CliRequestError } from './errors' +import type { CliUploadedInputFile } from './server' + +const MAX_ACTIVE_TRANSCRIPTIONS = 2 + +type AudioTranscriptionProviderSettings = Pick< + ProviderSettingsPort, + 'getProviderById' | 'getModelStatus' | 'isKnownModel' +> + +type AudioTranscriptionProviderRuntime = Pick + +export type CliAudioTranscriptionServiceOptions = Readonly<{ + providerSettings: AudioTranscriptionProviderSettings + providerRuntime: AudioTranscriptionProviderRuntime + artifactSpool: ArtifactSpool + now?: () => number + log?: Pick +}> + +function truncateAtCodePoint(value: string, maxCharacters: number): string { + let end = Math.min(value.length, maxCharacters) + const code = value.charCodeAt(end - 1) + if (code >= 0xd800 && code <= 0xdbff) end -= 1 + return value.slice(0, end) +} + +export class CliAudioTranscriptionService { + private readonly now: () => number + private readonly log: Pick + private activeTranscriptions = 0 + + constructor(private readonly options: CliAudioTranscriptionServiceOptions) { + this.now = options.now ?? Date.now + this.log = options.log ?? console + } + + handlesRpc(method: string): boolean { + return method === audioTranscribeArtifactRoute.name + } + + handlesUpload(method: string): boolean { + return method === audioTranscribeUploadRoute.name + } + + async dispatchRpc( + method: string, + rawInput: unknown, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise { + if (!this.handlesRpc(method)) { + throw new CliRequestError('not_found', 'Audio transcription method is not implemented', { + httpStatus: 404 + }) + } + return await this.transcribeArtifact( + audioTranscribeArtifactRoute.input.parse(rawInput), + caller, + signal + ) + } + + async dispatchUpload( + method: string, + rawInput: unknown, + upload: CliUploadedInputFile, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise { + if (caller.principal !== 'human') { + throw new CliRequestError('permission_denied', 'Agent callers cannot upload file bytes', { + httpStatus: 403 + }) + } + if (!this.handlesUpload(method)) { + throw new CliRequestError('not_found', 'Audio upload method is not implemented', { + httpStatus: 404 + }) + } + return await this.transcribeUpload( + audioTranscribeUploadRoute.input.parse(rawInput), + upload, + signal + ) + } + + private async transcribeArtifact( + input: AudioTranscriptionArtifactInput, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise { + return await this.options.artifactSpool.withFile(input.artifactId, caller, async (file) => { + const mimeType = AudioInputMimeTypeSchema.safeParse(file.metadata.mimeType) + if (!mimeType.success) { + throw new CliRequestError('invalid_request', 'Artifact is not an audio input') + } + this.assertInputSize(file.metadata.size, 'Audio artifact') + return await this.transcribeFile( + input, + file.path, + file.metadata.size, + mimeType.data, + file.metadata.filename, + signal + ) + }) + } + + private async transcribeUpload( + input: AudioTranscriptionUploadInput, + upload: CliUploadedInputFile, + signal: AbortSignal + ): Promise { + this.assertInputSize(upload.size, 'Audio upload') + return await this.transcribeFile( + input, + upload.path, + upload.size, + input.mimeType, + input.filename, + signal + ) + } + + private async transcribeFile( + input: Pick, + filePath: string, + inputBytes: number, + mimeType: string, + filename: string | undefined, + signal: AbortSignal + ): Promise { + this.requireAvailableModel(input.providerId, input.modelId) + if (this.activeTranscriptions >= MAX_ACTIVE_TRANSCRIPTIONS) { + throw new CliRequestError('rate_limited', 'Audio transcription capacity is full', { + httpStatus: 429, + retriable: true + }) + } + + this.activeTranscriptions += 1 + const startedAt = this.now() + try { + signal.throwIfAborted() + const bytes = await readFile(filePath, { signal }) + if (bytes.byteLength !== inputBytes) { + throw new CliRequestError('unavailable', 'Audio input changed before transcription', { + httpStatus: 410 + }) + } + signal.throwIfAborted() + const transcript = await this.options.providerRuntime.transcribeAudioStandalone( + input.providerId, + input.modelId, + bytes.toString('base64'), + mimeType, + filename, + { signal } + ) + signal.throwIfAborted() + const normalized = transcript.trim() + const truncated = normalized.length > AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS + return AudioTranscriptionOutputSchema.parse({ + providerId: input.providerId, + modelId: input.modelId, + text: truncated + ? truncateAtCodePoint(normalized, AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS) + : normalized, + truncated, + inputBytes, + mimeType, + durationMs: Math.max(0, this.now() - startedAt) + }) + } catch (error) { + throw this.normalizeError(error, input, signal) + } finally { + this.activeTranscriptions = Math.max(0, this.activeTranscriptions - 1) + } + } + + private assertInputSize(size: number, name: string): void { + if (!Number.isSafeInteger(size) || size <= 0) { + throw new CliRequestError('invalid_request', `${name} is empty or invalid`) + } + if (size > AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES) { + throw new CliRequestError('body_too_large', `${name} exceeds its byte limit`, { + httpStatus: 413 + }) + } + } + + private requireAvailableModel(providerId: string, modelId: string): void { + const provider = this.options.providerSettings.getProviderById(providerId) + if (!provider?.enable) { + throw new CliRequestError('not_found', 'Provider is not available', { httpStatus: 404 }) + } + if (!this.options.providerSettings.isKnownModel(providerId, modelId)) { + throw new CliRequestError('not_found', 'Model is not available', { httpStatus: 404 }) + } + if (!this.options.providerSettings.getModelStatus(providerId, modelId)) { + throw new CliRequestError('conflict', 'Model is disabled', { httpStatus: 409 }) + } + } + + private normalizeError( + error: unknown, + input: Pick, + signal: AbortSignal + ): CliRequestError { + if (error instanceof CliRequestError) return error + if (signal.aborted || (error instanceof Error && error.name === 'AbortError')) { + return new CliRequestError('cancelled', 'Audio transcription was cancelled', { + retriable: true + }) + } + this.log.warn('[CLI] Audio transcription failed', { + providerId: input.providerId, + modelId: input.modelId, + failure: { name: error instanceof Error ? error.name : typeof error } + }) + return new CliRequestError('unavailable', 'Audio transcription failed', { + httpStatus: 503, + retriable: true + }) + } +} diff --git a/src/main/cli/auditLog.ts b/src/main/cli/auditLog.ts new file mode 100644 index 0000000000..7dcf2db060 --- /dev/null +++ b/src/main/cli/auditLog.ts @@ -0,0 +1,161 @@ +import { constants } from 'node:fs' +import { chmod, lstat, mkdir, open, rename, unlink, type FileHandle } from 'node:fs/promises' +import path from 'node:path' +import type { CliPolicyAuditRecord } from './policy' + +const DEFAULT_MAX_AUDIT_BYTES = 10 * 1024 * 1024 + +export type CliAuditLogOptions = Readonly<{ + directory: string + maxBytes?: number +}> + +async function removeIfPresent(filePath: string): Promise { + try { + await unlink(filePath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } +} + +function positiveSafeInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value <= 0) throw new Error(`${name} must be positive`) + return value +} + +export class CliAuditLog { + private readonly filePath: string + private readonly rotatedPath: string + private readonly maxBytes: number + private handle: FileHandle | undefined + private size = 0 + private accepting = true + private tail = Promise.resolve() + private closePromise: Promise | undefined + + constructor(private readonly options: CliAuditLogOptions) { + this.maxBytes = positiveSafeInteger(options.maxBytes ?? DEFAULT_MAX_AUDIT_BYTES, 'maxBytes') + this.filePath = path.join(options.directory, 'audit.jsonl') + this.rotatedPath = path.join(options.directory, 'audit.1.jsonl') + } + + record(record: CliPolicyAuditRecord): Promise { + if (!this.accepting) return Promise.reject(new Error('CLI audit log is closed')) + const serialized = Buffer.from(`${JSON.stringify(record)}\n`, 'utf8') + if (serialized.length > this.maxBytes) { + return Promise.reject(new Error('CLI audit record exceeds the audit file limit')) + } + + const write = this.tail.catch(() => undefined).then(() => this.append(serialized)) + this.tail = write.catch(() => undefined) + return write + } + + async close(): Promise { + if (this.closePromise) return await this.closePromise + this.accepting = false + this.closePromise = (async () => { + await this.tail + await this.closeHandle() + })() + return await this.closePromise + } + + private async append(serialized: Buffer): Promise { + await this.ensureOpen() + if (this.size + serialized.length > this.maxBytes) { + await this.rotate() + } + if (!this.handle) throw new Error('CLI audit log is unavailable') + let offset = 0 + while (offset < serialized.length) { + const { bytesWritten } = await this.handle.write( + serialized, + offset, + serialized.length - offset + ) + if (bytesWritten === 0) throw new Error('CLI audit write made no progress') + offset += bytesWritten + } + this.size += serialized.length + } + + private async ensureOpen(): Promise { + if (this.handle) return + await mkdir(this.options.directory, { recursive: true, mode: 0o700 }) + const directoryStats = await lstat(this.options.directory) + if (!directoryStats.isDirectory()) throw new Error('CLI audit directory is not a directory') + if (process.platform !== 'win32') { + if (typeof process.getuid === 'function' && directoryStats.uid !== process.getuid()) { + throw new Error('CLI audit directory is not owned by the current user') + } + await chmod(this.options.directory, 0o700) + } + const handle = await this.openAuditFile() + try { + if (process.platform !== 'win32') await handle.chmod(0o600) + const stats = await handle.stat() + if (!stats.isFile()) throw new Error('CLI audit path is not a regular file') + if (process.platform !== 'win32') { + if (typeof process.getuid === 'function' && stats.uid !== process.getuid()) { + throw new Error('CLI audit file is not owned by the current user') + } + if (stats.nlink !== 1) throw new Error('CLI audit file must not have multiple links') + } + this.handle = handle + this.size = stats.size + } catch (error) { + await handle.close().catch(() => undefined) + throw error + } + } + + private async openAuditFile(): Promise { + const noFollow = process.platform === 'win32' ? 0 : constants.O_NOFOLLOW + const existingFlags = constants.O_APPEND | constants.O_WRONLY | noFollow + const createFlags = + constants.O_APPEND | constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY + + for (let attempt = 0; attempt < 8; attempt += 1) { + if (process.platform === 'win32') { + try { + const stats = await lstat(this.filePath) + if (!stats.isFile()) throw new Error('CLI audit path is not a regular file') + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + } + try { + return await open(this.filePath, existingFlags) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + + try { + return await open(this.filePath, createFlags, 0o600) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error + } + } + + throw new Error('CLI audit file changed repeatedly while opening') + } + + private async rotate(): Promise { + await this.closeHandle() + await removeIfPresent(this.rotatedPath) + try { + await rename(this.filePath, this.rotatedPath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + await this.ensureOpen() + } + + private async closeHandle(): Promise { + const handle = this.handle + this.handle = undefined + this.size = 0 + if (handle) await handle.close() + } +} diff --git a/src/main/cli/body.ts b/src/main/cli/body.ts new file mode 100644 index 0000000000..f8cb9313b7 --- /dev/null +++ b/src/main/cli/body.ts @@ -0,0 +1,261 @@ +import { createHash, randomUUID } from 'node:crypto' +import { mkdir, open, readFile, unlink, type FileHandle } from 'node:fs/promises' +import path from 'node:path' +import type { IncomingMessage } from 'node:http' +import { CliRequestError } from './errors' + +const DEFAULT_MAX_JSON_DEPTH = 64 +const DEFAULT_MAX_JSON_KEYS = 10_000 +const DEFAULT_MAX_JSON_NODES = 50_000 +const UNSAFE_JSON_KEYS = new Set(['__proto__', 'constructor', 'prototype']) + +export type BoundedRequestBody = + | Readonly<{ + kind: 'memory' + bytes: Buffer + size: number + sha256: string + cleanup(): Promise + }> + | Readonly<{ + kind: 'file' + path: string + size: number + sha256: string + cleanup(): Promise + }> + +export type BoundedBodyOptions = Readonly<{ + maxBytes: number + memoryThresholdBytes: number + tempDirectory: string + requireContentLength: boolean + consumeBytes?: (bytes: number) => void +}> + +export function readDeclaredBodyLength(request: IncomingMessage): number | null { + const distinctValues = request.headersDistinct['content-length'] + if (distinctValues && distinctValues.length !== 1) { + throw new CliRequestError('invalid_request', 'Content-Length must be singular') + } + + const rawValue = distinctValues?.[0] ?? request.headers['content-length'] + if (rawValue === undefined) return null + if (Array.isArray(rawValue) || !/^(0|[1-9][0-9]*)$/.test(rawValue)) { + throw new CliRequestError('invalid_request', 'Content-Length is invalid') + } + + const parsed = Number(rawValue) + if (!Number.isSafeInteger(parsed)) { + throw new CliRequestError('invalid_request', 'Content-Length is too large') + } + return parsed +} + +async function removeFile(filePath: string): Promise { + try { + await unlink(filePath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } +} + +async function writeAll(handle: FileHandle, bytes: Buffer, position: number): Promise { + let offset = 0 + while (offset < bytes.length) { + const { bytesWritten } = await handle.write( + bytes, + offset, + bytes.length - offset, + position + offset + ) + if (bytesWritten === 0) throw new Error('Failed to persist request body') + offset += bytesWritten + } + return position + bytes.length +} + +export async function readBoundedRequestBody( + request: IncomingMessage, + options: BoundedBodyOptions +): Promise { + if ( + !Number.isSafeInteger(options.maxBytes) || + options.maxBytes <= 0 || + !Number.isSafeInteger(options.memoryThresholdBytes) || + options.memoryThresholdBytes < 0 || + options.memoryThresholdBytes > options.maxBytes + ) { + throw new Error('Invalid bounded-body limits') + } + + if (request.headers['content-encoding'] !== undefined) { + throw new CliRequestError('invalid_request', 'Content-Encoding is not supported') + } + + const declaredLength = readDeclaredBodyLength(request) + if (options.requireContentLength && declaredLength === null) { + throw new CliRequestError('invalid_request', 'Content-Length is required', { + httpStatus: 411 + }) + } + if (declaredLength !== null && declaredLength > options.maxBytes) { + throw new CliRequestError('body_too_large', 'Request body exceeds its byte limit', { + httpStatus: 413 + }) + } + + const chunks: Buffer[] = [] + const sha256 = createHash('sha256') + let size = 0 + let filePosition = 0 + let fileHandle: FileHandle | undefined + let tempPath: string | undefined + + const cleanupPartial = async (): Promise => { + const cleanupErrors: unknown[] = [] + if (fileHandle) { + await fileHandle.close().catch((error: unknown) => cleanupErrors.push(error)) + fileHandle = undefined + } + if (tempPath) { + await removeFile(tempPath).catch((error: unknown) => cleanupErrors.push(error)) + } + if (cleanupErrors.length > 0) { + throw new AggregateError(cleanupErrors, 'Failed to clean up partial request body') + } + } + + try { + for await (const rawChunk of request) { + const chunk = Buffer.isBuffer(rawChunk) ? rawChunk : Buffer.from(rawChunk) + size += chunk.length + if (size > options.maxBytes) { + request.pause() + throw new CliRequestError('body_too_large', 'Request body exceeds its byte limit', { + httpStatus: 413 + }) + } + options.consumeBytes?.(chunk.length) + + sha256.update(chunk) + + if (!fileHandle && size > options.memoryThresholdBytes) { + await mkdir(options.tempDirectory, { recursive: true, mode: 0o700 }) + tempPath = path.join(options.tempDirectory, `body-${randomUUID()}.tmp`) + fileHandle = await open(tempPath, 'wx', 0o600) + for (const buffered of chunks) { + filePosition = await writeAll(fileHandle, buffered, filePosition) + } + chunks.length = 0 + } + + if (fileHandle) filePosition = await writeAll(fileHandle, chunk, filePosition) + else chunks.push(chunk) + } + + if (declaredLength !== null && size !== declaredLength) { + throw new CliRequestError('invalid_request', 'Request body length does not match') + } + + const digest = sha256.digest('hex') + + if (fileHandle && tempPath) { + await fileHandle.close() + fileHandle = undefined + const persistedPath = tempPath + let cleaned = false + return { + kind: 'file', + path: persistedPath, + size, + sha256: digest, + cleanup: async () => { + if (cleaned) return + await removeFile(persistedPath) + cleaned = true + } + } + } + + return { + kind: 'memory', + bytes: Buffer.concat(chunks, size), + size, + sha256: digest, + cleanup: async () => undefined + } + } catch (error) { + try { + await cleanupPartial() + } catch (cleanupError) { + throw new AggregateError( + [error, cleanupError], + 'Request body failed and cleanup was incomplete' + ) + } + throw error + } +} + +function assertBoundedJsonShape(value: unknown): void { + const pending: Array<{ value: unknown; depth: number }> = [{ value, depth: 0 }] + let keys = 0 + let nodes = 0 + + while (pending.length > 0) { + const current = pending.pop()! + nodes += 1 + if (nodes > DEFAULT_MAX_JSON_NODES) { + throw new CliRequestError('invalid_request', 'JSON body has too many values') + } + if (current.depth > DEFAULT_MAX_JSON_DEPTH) { + throw new CliRequestError('invalid_request', 'JSON body is nested too deeply') + } + if (Array.isArray(current.value)) { + for (const entry of current.value) { + pending.push({ value: entry, depth: current.depth + 1 }) + } + continue + } + if (!current.value || typeof current.value !== 'object') continue + + for (const [key, entry] of Object.entries(current.value)) { + keys += 1 + if (keys > DEFAULT_MAX_JSON_KEYS) { + throw new CliRequestError('invalid_request', 'JSON body has too many keys') + } + if (UNSAFE_JSON_KEYS.has(key)) { + throw new CliRequestError('invalid_request', `JSON key is not allowed: ${key}`) + } + pending.push({ value: entry, depth: current.depth + 1 }) + } + } +} + +export function parseBoundedJsonBytes(bytes: Uint8Array): unknown { + let text: string + try { + text = new TextDecoder('utf-8', { fatal: true }).decode(bytes) + } catch { + throw new CliRequestError('invalid_request', 'Request body is not valid UTF-8') + } + + let parsed: unknown + try { + parsed = JSON.parse(text) as unknown + } catch { + throw new CliRequestError('invalid_request', 'Request body is not valid JSON') + } + assertBoundedJsonShape(parsed) + return parsed +} + +export async function parseBoundedJsonBody(body: BoundedRequestBody): Promise { + try { + const bytes = body.kind === 'memory' ? body.bytes : await readFile(body.path) + return parseBoundedJsonBytes(bytes) + } finally { + await body.cleanup() + } +} diff --git a/src/main/cli/computeService.ts b/src/main/cli/computeService.ts new file mode 100644 index 0000000000..8ea624e1cb --- /dev/null +++ b/src/main/cli/computeService.ts @@ -0,0 +1,728 @@ +import { + MODEL_INVOKE_MAX_OUTPUT_CHARACTERS, + MediaGenerationEventSchema, + ModelInvokeEventSchema, + ModelInvokeProviderFailureSchema, + PublicProviderSchema, + imagesGenerateRoute, + modelsInvokeRoute, + providersListPublicRoute, + speechGenerateRoute, + videosGenerateRoute, + type ImageGenerationInput, + type ImageGenerationOutput, + type ArtifactMetadata, + type MediaGenerationEvent, + type ModelInvokeEvent, + type ModelInvokeInput, + type ModelInvokeOutput, + type PublicProvider, + type SpeechGenerationInput, + type SpeechGenerationOutput, + type VideoGenerationInput, + type VideoGenerationOutput +} from '@shared/contracts/routes' +import type { JsonValue } from '@shared/contracts/json' +import { ApiEndpointType, ModelType } from '@shared/model' +import type { LLMCoreStreamEvent, ProviderRoundStopReason } from '@shared/types/core/llm-events' +import type { ModelConfig } from '@shared/types/provider' +import { isVideoGenerationModelConfig } from '@shared/videoGenerationSettings' +import { isTtsModelConfig, isTtsModelId } from '@shared/ttsSettings' +import type { ProviderSettingsPort } from '@/provider/settings' +import type { ProviderRuntime } from '@/provider' +import { extractProviderFailureMetadata } from '@/provider/providerFailure' +import { + createRouteMap, + type CliRouteCaller, + type DeepchatRouteMap, + type RouteCaller +} from '@/routes/routeRegistry' +import { CliRequestError } from './errors' +import { resolveGeneratedMedia, type GeneratedMediaKind } from './mediaOutput' +import { artifactExtensionForMimeType, type ArtifactSpool } from './artifactSpool' +import { toPublicProviderSummary } from './providerModelAdminRoutes' + +const MAX_STREAM_DELTA_CHARACTERS = 1024 * 1024 +const MAX_MODEL_STREAM_EVENTS = 10_000 +const MAX_PUBLIC_PROVIDERS = 1_000 +const MAX_PUBLIC_MODELS = 10_000 + +type ComputeEmitter = (event: string, data: JsonValue) => Promise + +type ComputeProviderSettings = Pick< + ProviderSettingsPort, + | 'getProviders' + | 'getProviderById' + | 'getProviderModels' + | 'getCustomModels' + | 'getBatchModelStatus' + | 'getModelStatus' + | 'isKnownModel' + | 'getModelConfig' +> + +type ComputeProviderRuntime = Pick< + ProviderRuntime, + | 'executeWithRateLimit' + | 'streamChat' + | 'generateImageStandalone' + | 'generateVideoStandalone' + | 'generateSpeechStandalone' +> + +export type CliComputeServiceOptions = Readonly<{ + providerSettings: ComputeProviderSettings + providerRuntime: ComputeProviderRuntime + artifactSpool?: ArtifactSpool + mediaCacheDirectory?: string + now?: () => number + log?: Pick +}> + +function requireCliCaller(caller: RouteCaller): CliRouteCaller { + if (caller.kind !== 'cli') { + throw new CliRequestError('permission_denied', 'Compute routes require a CLI caller', { + httpStatus: 403 + }) + } + return caller +} + +function splitStreamDelta(value: string): string[] { + if (value.length === 0) return [] + if (value.length <= MAX_STREAM_DELTA_CHARACTERS) return [value] + const chunks: string[] = [] + let offset = 0 + while (offset < value.length) { + let end = Math.min(value.length, offset + MAX_STREAM_DELTA_CHARACTERS) + const lastCodeUnit = value.charCodeAt(end - 1) + if (end < value.length && lastCodeUnit >= 0xd800 && lastCodeUnit <= 0xdbff) end -= 1 + chunks.push(value.slice(offset, end)) + offset = end + } + return chunks +} + +function toUsage(event: Extract): ModelInvokeEvent { + return ModelInvokeEventSchema.parse({ + type: 'usage', + usage: { + promptTokens: event.usage.prompt_tokens, + completionTokens: event.usage.completion_tokens, + totalTokens: event.usage.total_tokens, + ...(event.usage.cached_tokens !== undefined + ? { cachedTokens: event.usage.cached_tokens } + : {}), + ...(event.usage.cache_write_tokens !== undefined + ? { cacheWriteTokens: event.usage.cache_write_tokens } + : {}) + } + }) +} + +function providerFailureIsRetryable( + statusCode: number | undefined, + retryable: boolean | undefined +) { + if (retryable !== undefined) return retryable + if (statusCode === undefined) return true + return statusCode === 408 || statusCode === 409 || statusCode === 429 || statusCode >= 500 +} + +export class CliComputeService { + private readonly now: () => number + private readonly log: Pick + + constructor(private readonly options: CliComputeServiceOptions) { + this.now = options.now ?? Date.now + this.log = options.log ?? console + } + + listPublicProviders(enabledOnly = false): PublicProvider[] { + const providers = this.options.providerSettings + .getProviders() + .filter((provider) => !enabledOnly || provider.enable) + if (providers.length > MAX_PUBLIC_PROVIDERS) { + throw new CliRequestError('result_too_large', 'Provider list exceeds the public limit', { + httpStatus: 413 + }) + } + + let totalModels = 0 + return providers.map((provider) => { + const modelsById = new Map( + [ + ...this.options.providerSettings.getProviderModels(provider.id), + ...this.options.providerSettings.getCustomModels(provider.id) + ].map((model) => [model.id, model] as const) + ) + totalModels += modelsById.size + if (totalModels > MAX_PUBLIC_MODELS) { + throw new CliRequestError('result_too_large', 'Model list exceeds the public limit', { + httpStatus: 413 + }) + } + const status = this.options.providerSettings.getBatchModelStatus( + provider.id, + Array.from(modelsById.keys()) + ) + const models = Array.from(modelsById.values()) + .map((model) => ({ + id: model.id, + name: model.name, + group: model.group, + enabled: status[model.id] ?? false, + custom: model.isCustom === true, + vision: model.vision === true, + functionCall: model.functionCall === true, + reasoning: model.reasoning === true, + enableSearch: model.enableSearch === true, + ...(model.type ? { type: model.type } : {}), + ...(model.contextLength !== undefined ? { contextLength: model.contextLength } : {}), + ...(model.maxTokens !== undefined ? { maxTokens: model.maxTokens } : {}) + })) + .filter((model) => !enabledOnly || model.enabled) + + return PublicProviderSchema.parse({ + ...toPublicProviderSummary(provider), + models + }) + }) + } + + async dispatchStream( + method: string, + rawInput: unknown, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + emit: ComputeEmitter + ): Promise { + switch (method) { + case modelsInvokeRoute.name: + return await this.invokeModel(modelsInvokeRoute.input.parse(rawInput), signal, emit) + case imagesGenerateRoute.name: + return await this.generateImages( + imagesGenerateRoute.input.parse(rawInput), + caller, + requestId, + signal, + emit + ) + case videosGenerateRoute.name: + return await this.generateVideos( + videosGenerateRoute.input.parse(rawInput), + caller, + requestId, + signal, + emit + ) + case speechGenerateRoute.name: + return await this.generateSpeech( + speechGenerateRoute.input.parse(rawInput), + caller, + requestId, + signal, + emit + ) + default: + throw new CliRequestError('not_found', 'Streaming method is not implemented', { + httpStatus: 404 + }) + } + } + + private requireAvailableModel(providerId: string, modelId: string): ModelConfig { + const provider = this.options.providerSettings.getProviderById(providerId) + if (!provider?.enable) { + throw new CliRequestError('not_found', 'Provider is not available', { httpStatus: 404 }) + } + if (!this.options.providerSettings.isKnownModel(providerId, modelId)) { + throw new CliRequestError('not_found', 'Model is not available', { httpStatus: 404 }) + } + if (!this.options.providerSettings.getModelStatus(providerId, modelId)) { + throw new CliRequestError('conflict', 'Model is disabled', { httpStatus: 409 }) + } + return this.options.providerSettings.getModelConfig(modelId, providerId) + } + + private async invokeModel( + input: ModelInvokeInput, + signal: AbortSignal, + emit: ComputeEmitter + ): Promise { + const startedAt = this.now() + let providerError: Extract | undefined + let emittedEvents = 0 + const emitEvent = async (event: ModelInvokeEvent): Promise => { + if (emittedEvents >= MAX_MODEL_STREAM_EVENTS) { + throw new CliRequestError('result_too_large', 'Model stream exceeds the event limit', { + httpStatus: 413 + }) + } + emittedEvents += 1 + await emit(modelsInvokeRoute.name, event) + } + try { + signal.throwIfAborted() + const modelConfig = this.requireAvailableModel(input.providerId, input.modelId) + if (modelConfig.type !== ModelType.Chat) { + throw new CliRequestError('conflict', 'Model is not configured for raw text invocation', { + httpStatus: 409 + }) + } + + const queueStartedAt = this.now() + let queuedEmission = Promise.resolve() + let queuedEmissionFailure: { error: unknown } | undefined + let admissionFailure: { error: unknown } | undefined + try { + await this.options.providerRuntime.executeWithRateLimit(input.providerId, { + signal, + onQueued: (snapshot) => { + const event = ModelInvokeEventSchema.parse({ + type: 'rate_limit', + providerId: snapshot.providerId, + qpsLimit: snapshot.qpsLimit, + currentQps: snapshot.currentQps, + queueLength: snapshot.queueLength, + estimatedWaitTimeMs: snapshot.estimatedWaitTime + }) + queuedEmission = queuedEmission.then(async () => { + if (queuedEmissionFailure) return + try { + await emitEvent(event) + } catch (error) { + queuedEmissionFailure = { error } + } + }) + } + }) + } catch (error) { + admissionFailure = { error } + } + const queueFinishedAt = this.now() + await queuedEmission + if (admissionFailure) throw admissionFailure.error + if (queuedEmissionFailure) throw queuedEmissionFailure.error + + const stream = this.options.providerRuntime.streamChat( + input.providerId, + input.messages, + input.modelId, + modelConfig, + input.temperature ?? modelConfig.temperature ?? 0.7, + input.maxTokens ?? modelConfig.maxTokens, + [], + { signal } + ) + const textChunks: string[] = [] + const reasoningChunks: string[] = [] + let outputCharacters = 0 + let usage: ModelInvokeOutput['usage'] + let finishReason: ProviderRoundStopReason | undefined + let firstEventAt: number | undefined + let firstTextAt: number | undefined + + for await (const event of stream) { + signal.throwIfAborted() + let eventAt: number | undefined + if (firstEventAt === undefined) { + eventAt = this.now() + firstEventAt = eventAt + } + switch (event.type) { + case 'text': + case 'reasoning': { + const delta = event.type === 'text' ? event.content : event.reasoning_content + outputCharacters += delta.length + if (outputCharacters > MODEL_INVOKE_MAX_OUTPUT_CHARACTERS) { + throw new CliRequestError('result_too_large', 'Model output exceeds the text limit', { + httpStatus: 413 + }) + } + if (event.type === 'text' && firstTextAt === undefined && delta.length > 0) { + firstTextAt = eventAt ?? this.now() + } + if (event.type === 'text') textChunks.push(delta) + else reasoningChunks.push(delta) + for (const chunk of splitStreamDelta(delta)) { + await emitEvent( + ModelInvokeEventSchema.parse({ + type: event.type === 'text' ? 'text_delta' : 'reasoning_delta', + text: chunk + }) + ) + } + break + } + case 'usage': { + const usageEvent = toUsage(event) + usage = usageEvent.type === 'usage' ? usageEvent.usage : undefined + await emitEvent(usageEvent) + break + } + case 'rate_limit': + await emitEvent( + ModelInvokeEventSchema.parse({ + type: 'rate_limit', + providerId: event.rate_limit.providerId, + qpsLimit: event.rate_limit.qpsLimit, + currentQps: event.rate_limit.currentQps, + queueLength: event.rate_limit.queueLength, + ...(event.rate_limit.estimatedWaitTime !== undefined + ? { estimatedWaitTimeMs: event.rate_limit.estimatedWaitTime } + : {}) + }) + ) + break + case 'stop': + finishReason = event.stop_reason + await emitEvent( + ModelInvokeEventSchema.parse({ type: 'stop', reason: event.stop_reason }) + ) + break + case 'error': + providerError = event + throw new Error('Provider returned an error event') + case 'tool_call_start': + case 'tool_call_chunk': + case 'tool_call_end': + case 'permission': + case 'plan': + case 'image_data': + throw new CliRequestError( + 'conflict', + 'Raw model invocation returned an unsupported event', + { httpStatus: 409 } + ) + } + } + + if (!finishReason) { + throw new Error('Provider stream ended without a stop event') + } + if (finishReason === 'error') { + throw new Error('Provider stream stopped with an error') + } + const text = textChunks.join('') + const reasoning = reasoningChunks.join('') + return modelsInvokeRoute.output.parse({ + providerId: input.providerId, + modelId: input.modelId, + text, + ...(reasoning ? { reasoning } : {}), + ...(usage ? { usage } : {}), + finishReason, + latency: { + queueMs: Math.max(0, queueFinishedAt - queueStartedAt), + firstEventMs: firstEventAt === undefined ? null : Math.max(0, firstEventAt - startedAt), + firstTextMs: firstTextAt === undefined ? null : Math.max(0, firstTextAt - startedAt), + totalMs: Math.max(0, this.now() - startedAt) + } + }) + } catch (error) { + if (error instanceof CliRequestError) throw error + if (signal.aborted || (error instanceof Error && error.name === 'AbortError')) { + throw new CliRequestError('cancelled', 'Model invocation was cancelled', { + retriable: true + }) + } + const metadata = extractProviderFailureMetadata(providerError ?? error) + const failure = ModelInvokeProviderFailureSchema.parse({ + ...(metadata?.statusCode !== undefined ? { statusCode: metadata.statusCode } : {}), + retryable: providerFailureIsRetryable(metadata?.statusCode, metadata?.retryable) + }) + this.log.warn('[CLI] Model invocation failed', { + providerId: input.providerId, + modelId: input.modelId, + failure + }) + throw new CliRequestError('unavailable', 'Model provider request failed', { + httpStatus: 503, + retriable: failure.retryable, + details: { providerFailure: failure } + }) + } + } + + private async generateImages( + input: ImageGenerationInput, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + emit: ComputeEmitter + ): Promise { + const startedAt = this.now() + try { + const modelConfig = this.requireAvailableModel(input.providerId, input.modelId) + if ( + modelConfig.type !== ModelType.ImageGeneration && + modelConfig.apiEndpoint !== ApiEndpointType.Image && + modelConfig.endpointType !== 'image-generation' + ) { + throw new CliRequestError('conflict', 'Model is not configured for image generation', { + httpStatus: 409 + }) + } + await this.emitMediaStarted(imagesGenerateRoute.name, input, emit) + const result = await this.options.providerRuntime.generateImageStandalone( + input.providerId, + input.prompt, + input.modelId, + input.options, + { signal } + ) + this.requireMatchingMediaIdentity(result, input) + const artifacts = await this.persistMedia( + imagesGenerateRoute.name, + result.images, + 'image', + 8, + caller, + requestId, + signal, + emit + ) + return imagesGenerateRoute.output.parse({ + providerId: input.providerId, + modelId: input.modelId, + artifacts, + ...(input.options ? { requestedOptions: input.options } : {}), + durationMs: Math.max(0, this.now() - startedAt) + }) + } catch (error) { + throw this.normalizeMediaFailure(error, input, signal, 'Image generation failed') + } + } + + private async generateVideos( + input: VideoGenerationInput, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + emit: ComputeEmitter + ): Promise { + const startedAt = this.now() + try { + const modelConfig = this.requireAvailableModel(input.providerId, input.modelId) + if (!isVideoGenerationModelConfig(modelConfig, input.modelId)) { + throw new CliRequestError('conflict', 'Model is not configured for video generation', { + httpStatus: 409 + }) + } + await this.emitMediaStarted(videosGenerateRoute.name, input, emit) + const result = await this.options.providerRuntime.generateVideoStandalone( + input.providerId, + input.prompt, + input.modelId, + input.options, + { signal } + ) + this.requireMatchingMediaIdentity(result, input) + const artifacts = await this.persistMedia( + videosGenerateRoute.name, + result.videos, + 'video', + 4, + caller, + requestId, + signal, + emit + ) + return videosGenerateRoute.output.parse({ + providerId: input.providerId, + modelId: input.modelId, + artifacts, + ...(input.options ? { requestedOptions: input.options } : {}), + durationMs: Math.max(0, this.now() - startedAt) + }) + } catch (error) { + throw this.normalizeMediaFailure(error, input, signal, 'Video generation failed') + } + } + + private async generateSpeech( + input: SpeechGenerationInput, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + emit: ComputeEmitter + ): Promise { + const startedAt = this.now() + try { + const modelConfig = this.requireAvailableModel(input.providerId, input.modelId) + if (!isTtsModelConfig(modelConfig) && !isTtsModelId(input.modelId)) { + throw new CliRequestError('conflict', 'Model is not configured for speech generation', { + httpStatus: 409 + }) + } + await this.emitMediaStarted(speechGenerateRoute.name, input, emit) + const result = await this.options.providerRuntime.generateSpeechStandalone( + input.providerId, + input.text, + input.modelId, + input.options, + { signal } + ) + this.requireMatchingMediaIdentity(result, input) + const artifacts = await this.persistMedia( + speechGenerateRoute.name, + [result.audio], + 'audio', + 1, + caller, + requestId, + signal, + emit + ) + return speechGenerateRoute.output.parse({ + providerId: input.providerId, + modelId: input.modelId, + artifacts, + ...(input.options ? { requestedOptions: input.options } : {}), + durationMs: Math.max(0, this.now() - startedAt) + }) + } catch (error) { + throw this.normalizeMediaFailure(error, input, signal, 'Speech generation failed') + } + } + + private async emitMediaStarted( + method: string, + input: { providerId: string; modelId: string }, + emit: ComputeEmitter + ): Promise { + await emit( + method, + MediaGenerationEventSchema.parse({ + type: 'started', + providerId: input.providerId, + modelId: input.modelId + }) + ) + } + + private requireMatchingMediaIdentity( + result: { providerId: string; modelId: string }, + input: { providerId: string; modelId: string } + ): void { + if (result.providerId !== input.providerId || result.modelId !== input.modelId) { + throw new CliRequestError('unavailable', 'Provider returned inconsistent media output', { + httpStatus: 503, + retriable: true + }) + } + } + + private async persistMedia( + method: string, + outputs: readonly { data: string; mimeType: string }[], + kind: GeneratedMediaKind, + maxOutputs: number, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + emit: ComputeEmitter + ) { + const artifactSpool = this.options.artifactSpool + const mediaCacheDirectory = this.options.mediaCacheDirectory + if (!artifactSpool || !mediaCacheDirectory) { + throw new CliRequestError('unavailable', 'Media artifact service is unavailable', { + httpStatus: 503, + retriable: true + }) + } + if (outputs.length === 0) { + throw new CliRequestError('unavailable', `Provider returned no ${kind} output`, { + httpStatus: 503, + retriable: true + }) + } + if (outputs.length > maxOutputs) { + throw new CliRequestError('result_too_large', `Provider returned too many ${kind} outputs`, { + httpStatus: 413 + }) + } + + const artifacts: ArtifactMetadata[] = [] + try { + for (const [index, output] of outputs.entries()) { + signal.throwIfAborted() + const resolved = await resolveGeneratedMedia( + output.data, + output.mimeType, + kind, + mediaCacheDirectory + ) + try { + const artifact = await artifactSpool.write({ + caller, + requestId, + mimeType: resolved.mimeType, + suggestedFilename: `generated-${kind}-${index + 1}${artifactExtensionForMimeType(resolved.mimeType)}`, + data: resolved.data, + signal + }) + if (artifact.size !== resolved.expectedBytes) { + await artifactSpool.discard(artifact.id) + throw new CliRequestError('unavailable', 'Generated media changed while being stored', { + httpStatus: 503, + retriable: true + }) + } + artifacts.push(artifact) + } finally { + await resolved.dispose?.() + } + } + for (const [index, artifact] of artifacts.entries()) { + const event: MediaGenerationEvent = MediaGenerationEventSchema.parse({ + type: 'artifact', + index, + artifact + }) + await emit(method, event) + } + return artifacts + } catch (error) { + await Promise.allSettled(artifacts.map((artifact) => artifactSpool.discard(artifact.id))) + throw error + } + } + + private normalizeMediaFailure( + error: unknown, + input: { providerId: string; modelId: string }, + signal: AbortSignal, + message: string + ): CliRequestError { + if (error instanceof CliRequestError) return error + if (signal.aborted || (error instanceof Error && error.name === 'AbortError')) { + return new CliRequestError('cancelled', 'Media generation was cancelled', { + retriable: true + }) + } + this.log.warn('[CLI] Media generation failed', { + providerId: input.providerId, + modelId: input.modelId, + failure: { name: error instanceof Error ? error.name : typeof error } + }) + return new CliRequestError('unavailable', message, { httpStatus: 503, retriable: true }) + } +} + +export function createCliComputeRoutes(service: CliComputeService): DeepchatRouteMap { + return createRouteMap([ + [ + providersListPublicRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = providersListPublicRoute.input.parse(rawInput) + return providersListPublicRoute.output.parse({ + providers: service.listPublicProviders(input.enabledOnly ?? false) + }) + } + ] + ]) +} diff --git a/src/main/cli/descriptor.ts b/src/main/cli/descriptor.ts new file mode 100644 index 0000000000..59533720d4 --- /dev/null +++ b/src/main/cli/descriptor.ts @@ -0,0 +1,257 @@ +import { createHash, randomBytes, randomUUID } from 'node:crypto' +import { execFile } from 'node:child_process' +import { + chmod, + lstat, + mkdir, + open, + readFile, + readdir, + rename, + rmdir, + unlink +} from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { promisify } from 'node:util' +import { + LOCAL_CONTROL_DESCRIPTOR_FILENAME, + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION, + LocalControlDescriptorSchema, + type LocalControlDescriptor, + type LocalControlEndpoint +} from '@shared/contracts/localControl' + +const execFileAsync = promisify(execFile) +const MAX_POSIX_SOCKET_PATH_BYTES = 100 +const OWNED_TEMP_FILE_PATTERN = + /^body-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.tmp$/ + +export type CliControlLayout = Readonly<{ + controlDirectory: string + descriptorPath: string + tempDirectory: string + endpointDirectory: string + endpoint: LocalControlEndpoint +}> + +async function removeIfPresent(filePath: string): Promise { + try { + await unlink(filePath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } +} + +async function applyWindowsOwnerAcl(targetPath: string, directory: boolean): Promise { + const username = os.userInfo().username + const grant = directory ? `${username}:(OI)(CI)F` : `${username}:F` + await execFileAsync('icacls.exe', [targetPath, '/inheritance:r', '/grant:r', grant], { + windowsHide: true, + timeout: 5_000 + }) +} + +async function preparePrivatePosixDirectory(directory: string): Promise { + await mkdir(directory, { recursive: true, mode: 0o700 }) + const directoryStat = await lstat(directory) + if (!directoryStat.isDirectory()) throw new Error('Local-control path is not a directory') + if (typeof process.getuid === 'function' && directoryStat.uid !== process.getuid()) { + throw new Error('Local-control directory is not owned by the current user') + } + await chmod(directory, 0o700) + const protectedStat = await lstat(directory) + if ((protectedStat.mode & 0o077) !== 0) { + throw new Error('Local-control directory permissions are not private') + } +} + +function createFallbackSocketPath(userDataPath: string): string { + const profileIdentity = createHash('sha256') + .update(path.resolve(userDataPath)) + .digest('hex') + .slice(0, 16) + const ownerIdentity = + typeof process.getuid === 'function' + ? String(process.getuid()) + : createHash('sha256').update(os.userInfo().username).digest('hex').slice(0, 8) + const directoryName = `deepchat-${ownerIdentity}-${profileIdentity}` + const bases = [process.env.XDG_RUNTIME_DIR, os.tmpdir(), '/tmp'] + + for (const base of bases) { + if (!base || !path.isAbsolute(base)) continue + const candidate = path.join(base, directoryName, 'control.sock') + if (Buffer.byteLength(candidate) <= MAX_POSIX_SOCKET_PATH_BYTES) return candidate + } + throw new Error('No private path is short enough for the DeepChat Unix socket') +} + +export function createLocalControlLayout( + userDataPath: string, + platform: NodeJS.Platform = process.platform +): CliControlLayout { + const controlDirectory = path.join(userDataPath, 'local-control') + const descriptorPath = path.join(controlDirectory, LOCAL_CONTROL_DESCRIPTOR_FILENAME) + const tempDirectory = path.join(controlDirectory, 'tmp') + + if (platform === 'win32') { + const identity = createHash('sha256') + .update(path.resolve(userDataPath)) + .digest('hex') + .slice(0, 16) + return { + controlDirectory, + descriptorPath, + tempDirectory, + endpointDirectory: controlDirectory, + endpoint: { + kind: 'pipe', + name: `\\\\.\\pipe\\deepchat-${identity}-${randomUUID()}` + } + } + } + + const preferredSocketPath = path.join(controlDirectory, 'control.sock') + const socketPath = + Buffer.byteLength(preferredSocketPath) <= MAX_POSIX_SOCKET_PATH_BYTES + ? preferredSocketPath + : createFallbackSocketPath(userDataPath) + return { + controlDirectory, + descriptorPath, + tempDirectory, + endpointDirectory: path.dirname(socketPath), + endpoint: { kind: 'unix', path: socketPath } + } +} + +export async function prepareLocalControlLayout( + layout: CliControlLayout, + platform: NodeJS.Platform = process.platform +): Promise { + if (platform === 'win32') { + await mkdir(layout.controlDirectory, { recursive: true, mode: 0o700 }) + await mkdir(layout.tempDirectory, { recursive: true, mode: 0o700 }) + await applyWindowsOwnerAcl(layout.controlDirectory, true) + await applyWindowsOwnerAcl(layout.tempDirectory, true) + } else { + await preparePrivatePosixDirectory(layout.controlDirectory) + await preparePrivatePosixDirectory(layout.tempDirectory) + if (layout.endpointDirectory !== layout.controlDirectory) { + await preparePrivatePosixDirectory(layout.endpointDirectory) + } + } + + for (const entry of await readdir(layout.tempDirectory, { withFileTypes: true })) { + if (OWNED_TEMP_FILE_PATTERN.test(entry.name) && (entry.isFile() || entry.isSymbolicLink())) { + await unlink(path.join(layout.tempDirectory, entry.name)) + } + } + + if (layout.endpoint.kind === 'unix') { + try { + const socketStat = await lstat(layout.endpoint.path) + if (!socketStat.isSocket()) { + throw new Error('Refusing to replace a non-socket local-control endpoint') + } + await unlink(layout.endpoint.path) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + } + await removeIfPresent(layout.descriptorPath) +} + +export function createLocalControlToken(): string { + return randomBytes(32).toString('base64url') +} + +export async function writeLocalControlDescriptor( + layout: CliControlLayout, + input: { + appVersion: string + endpoint: LocalControlEndpoint + pid: number + token: string + startedAt: number + }, + platform: NodeJS.Platform = process.platform +): Promise { + const descriptor = LocalControlDescriptorSchema.parse({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + ...input + }) + const tempPath = path.join(layout.controlDirectory, `.descriptor-${randomUUID()}.tmp`) + const handle = await open(tempPath, 'wx', 0o600) + try { + try { + await handle.writeFile(`${JSON.stringify(descriptor)}\n`, 'utf8') + await handle.sync() + } finally { + await handle.close() + } + if (platform === 'win32') await applyWindowsOwnerAcl(tempPath, false) + else await chmod(tempPath, 0o600) + await rename(tempPath, layout.descriptorPath) + if (platform === 'win32') await applyWindowsOwnerAcl(layout.descriptorPath, false) + else await chmod(layout.descriptorPath, 0o600) + return descriptor + } catch (error) { + await removeIfPresent(tempPath).catch(() => undefined) + throw error + } +} + +export async function protectUnixSocket(socketPath: string): Promise { + await chmod(socketPath, 0o600) + const socketStat = await lstat(socketPath) + if (!socketStat.isSocket()) throw new Error('Local-control endpoint is not a Unix socket') + if (typeof process.getuid === 'function' && socketStat.uid !== process.getuid()) { + throw new Error('Local-control socket is not owned by the current user') + } + if ((socketStat.mode & 0o077) !== 0) { + throw new Error('Local-control socket permissions are not private') + } +} + +export async function cleanupLocalControlLayout( + layout: CliControlLayout, + token: string +): Promise { + let endpointBelongsToCaller = true + try { + const raw = await readFile(layout.descriptorPath, 'utf8') + let parsed: unknown + try { + parsed = JSON.parse(raw) as unknown + } catch { + parsed = null + } + const current = LocalControlDescriptorSchema.safeParse(parsed) + if (current.success && current.data.token === token) { + await removeIfPresent(layout.descriptorPath) + } else if (current.success) { + endpointBelongsToCaller = false + } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + + if (!endpointBelongsToCaller || layout.endpoint.kind !== 'unix') return + try { + const socketStat = await lstat(layout.endpoint.path) + if (socketStat.isSocket()) await unlink(layout.endpoint.path) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + if (layout.endpointDirectory !== layout.controlDirectory) { + try { + await rmdir(layout.endpointDirectory) + } catch (error) { + const code = (error as NodeJS.ErrnoException).code + if (code !== 'ENOENT' && code !== 'ENOTEMPTY') throw error + } + } +} diff --git a/src/main/cli/errors.ts b/src/main/cli/errors.ts new file mode 100644 index 0000000000..a07c3f857e --- /dev/null +++ b/src/main/cli/errors.ts @@ -0,0 +1,25 @@ +import type { JsonValue } from '@shared/contracts/common' +import type { LocalControlErrorCode } from '@shared/contracts/localControl' + +export class CliRequestError extends Error { + constructor( + readonly code: LocalControlErrorCode, + message: string, + readonly options: { + httpStatus?: number + retriable?: boolean + details?: Record + } = {} + ) { + super(message) + this.name = 'CliRequestError' + } + + get httpStatus(): number { + return this.options.httpStatus ?? 400 + } + + get retriable(): boolean { + return this.options.retriable ?? false + } +} diff --git a/src/main/cli/index.ts b/src/main/cli/index.ts new file mode 100644 index 0000000000..ddebae5e58 --- /dev/null +++ b/src/main/cli/index.ts @@ -0,0 +1,49 @@ +export { CliServer, type CliServerDependencies } from './server' +export { + AgentCliTokenAuthority, + type AgentCliRequestBeginResult, + type AgentCliRequestGrant, + type AgentCliTokenClaims, + type IssuedAgentCliToken +} from './agentTokenAuthority' +export { + AgentCliCommandAccess, + resolveBundledCliDirectory, + type AgentCliCommandAccessOptions +} from './agentCommandAccess' +export { CliAuditLog, type CliAuditLogOptions } from './auditLog' +export { ArtifactSpool, type ArtifactSpoolOptions } from './artifactSpool' +export { createArtifactRoutes } from './artifactRoutes' +export { CliComputeService, createCliComputeRoutes } from './computeService' +export { + CliAudioTranscriptionService, + type CliAudioTranscriptionServiceOptions +} from './audioTranscriptionService' +export { CliOcrService, type CliOcrServiceOptions } from './ocrService' +export { createCliMcpAdminRoutes, type CliMcpAdminDependencies } from './mcpAdminRoutes' +export { CliSkillService, type CliSkillServiceOptions } from './skillService' +export { CliRunService, type CliRunServiceOptions } from './runService' +export { createCliRoutes, type CliRuntimeStatus } from './routes' +export { + CliLauncherService, + type CliLauncherReason, + type CliLauncherServiceOptions, + type CliLauncherState, + type CliLauncherStatus +} from './launcherService' +export { + createCliProviderModelAdminRoutes, + type CliProviderModelAdminDependencies +} from './providerModelAdminRoutes' +export { CLI_SURFACE_V1, getCliSurfaceEntry, listCliSurfaceCapabilities } from './surface' +export { + CliMutationGuard, + type CliApprovalPresentationPort, + type CliApprovalTarget +} from './mutationGuard' +export { + CliRequestPolicy, + type CliPolicyAuditRecord, + type CliRequestAdmission, + type CliRequestPolicyInput +} from './policy' diff --git a/src/main/cli/launcherService.ts b/src/main/cli/launcherService.ts new file mode 100644 index 0000000000..3e2fb7827b --- /dev/null +++ b/src/main/cli/launcherService.ts @@ -0,0 +1,1244 @@ +import { createHash, randomUUID } from 'node:crypto' +import { + chmod, + lstat, + mkdir, + readFile, + readlink, + realpath, + rename, + symlink, + unlink, + writeFile +} from 'node:fs/promises' +import path from 'node:path' + +export type CliLauncherState = + | 'not-installed' + | 'installed' + | 'stale' + | 'needs-repair' + | 'conflict' + | 'unavailable' + +export type CliLauncherReason = + | 'unsupported-platform' + | 'source-missing' + | 'path-unavailable' + | 'ownership-marker-invalid' + | 'unowned-command' + | 'command-modified' + | 'command-missing' + | 'shell-config-modified' + | 'shell-config-too-large' + | 'shell-config-missing' + | 'upgrade-required' + +export type CliLauncherStatus = Readonly<{ + state: CliLauncherState + reason: CliLauncherReason | null + commandPath: string | null + shellConfigPath: string | null +}> + +const LAUNCHER_MARKER_VERSION = 1 +const LAUNCHER_MARKER_FILENAME = 'launcher.json' +const MANAGED_BLOCK_START = '# >>> DeepChat CLI >>>' +const MANAGED_BLOCK_END = '# <<< DeepChat CLI <<<' +const MAX_MARKER_BYTES = 16 * 1024 +const MAX_SHELL_CONFIG_BYTES = 1024 * 1024 + +type PosixProfileKind = 'zsh' | 'bash' | 'bash-login' | 'fish' | 'profile' + +type PosixLauncherMarker = Readonly<{ + version: 1 + platform: 'posix' + commandPath: string + launcherTarget: string + commandHash?: string + profileKind: PosixProfileKind | null + profilePrefixLength: 0 | 1 | 2 + profileCreated: boolean +}> + +type WindowsLauncherMarker = Readonly<{ + version: 1 + platform: 'windows' + commandPath: string + commandHash: string +}> + +type LauncherMarker = PosixLauncherMarker | WindowsLauncherMarker + +export type CliLauncherServiceOptions = Readonly<{ + platform?: NodeJS.Platform + homeDirectory: string + userDataDirectory: string + environmentPath?: string + shell?: string + localAppDataDirectory?: string + resolveCliDirectory(): string | null +}> + +type MarkerReadResult = + | Readonly<{ state: 'missing'; raw: null }> + | Readonly<{ state: 'invalid'; raw: string }> + | Readonly<{ state: 'valid'; raw: string; marker: LauncherMarker }> + +type ProfileInspection = Readonly<{ + kind: PosixProfileKind + path: string + content: string + exists: boolean + blockState: 'missing' | 'exact' | 'modified' | 'too-large' +}> + +type AppendedManagedBlock = Readonly<{ + content: string + prefixLength: 0 | 1 | 2 +}> + +type CliSource = Readonly<{ + posixLauncher: string + modulePath: string + runtimeNode: string +}> + +type OwnedCommand = + | Readonly<{ kind: 'link'; value: string }> + | Readonly<{ kind: 'text'; value: string; executable: boolean }> + +function sha256(value: string): string { + return createHash('sha256').update(value).digest('hex') +} + +function isMissingFileError(error: unknown): boolean { + return (error as NodeJS.ErrnoException).code === 'ENOENT' +} + +function isPathWithin(root: string, candidate: string): boolean { + const relative = path.relative(path.resolve(root), path.resolve(candidate)) + return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative)) +} + +function pathsEqual(left: string, right: string, platform: NodeJS.Platform): boolean { + const normalizedLeft = path.resolve(left) + const normalizedRight = path.resolve(right) + return platform === 'win32' + ? normalizedLeft.toLowerCase() === normalizedRight.toLowerCase() + : normalizedLeft === normalizedRight +} + +function isPosixProfileKind(value: unknown): value is PosixProfileKind { + return ( + value === 'zsh' || + value === 'bash' || + value === 'bash-login' || + value === 'fish' || + value === 'profile' + ) +} + +function parseLauncherMarker(value: unknown): LauncherMarker | null { + if (!value || typeof value !== 'object' || Array.isArray(value)) return null + const marker = value as Record + if (marker.version !== LAUNCHER_MARKER_VERSION || typeof marker.commandPath !== 'string') { + return null + } + if ( + marker.platform === 'posix' && + typeof marker.launcherTarget === 'string' && + (marker.commandHash === undefined || + (typeof marker.commandHash === 'string' && /^[0-9a-f]{64}$/.test(marker.commandHash))) && + (marker.profileKind === null || isPosixProfileKind(marker.profileKind)) && + (marker.profilePrefixLength === 0 || + marker.profilePrefixLength === 1 || + marker.profilePrefixLength === 2) && + typeof marker.profileCreated === 'boolean' + ) { + return marker as PosixLauncherMarker + } + if ( + marker.platform === 'windows' && + typeof marker.commandHash === 'string' && + /^[0-9a-f]{64}$/.test(marker.commandHash) + ) { + return marker as WindowsLauncherMarker + } + return null +} + +function managedProfileBlock(kind: PosixProfileKind): string { + const command = + kind === 'fish' + ? 'fish_add_path --global --move "$HOME/.local/bin"' + : 'case ":$PATH:" in\n *":$HOME/.local/bin:"*) ;;\n *) export PATH="$HOME/.local/bin:$PATH" ;;\nesac' + return `${MANAGED_BLOCK_START}\n${command}\n${MANAGED_BLOCK_END}` +} + +function inspectManagedBlock(content: string, block: string): ProfileInspection['blockState'] { + const blockOccurrences = content.split(block).length - 1 + const startOccurrences = content.split(MANAGED_BLOCK_START).length - 1 + const endOccurrences = content.split(MANAGED_BLOCK_END).length - 1 + if (blockOccurrences === 1 && startOccurrences === 1 && endOccurrences === 1) return 'exact' + if (startOccurrences === 0 && endOccurrences === 0) return 'missing' + return 'modified' +} + +function appendManagedBlock(content: string, block: string): AppendedManagedBlock { + const prefixLength: AppendedManagedBlock['prefixLength'] = content + ? content.endsWith('\n') + ? 1 + : 2 + : 0 + return { + content: `${content}${'\n'.repeat(prefixLength)}${block}\n`, + prefixLength + } +} + +function hasManagedBlockPrefix(content: string, block: string, prefixLength: 0 | 1 | 2): boolean { + const index = content.indexOf(block) + return ( + index >= prefixLength && + content.slice(index - prefixLength, index) === '\n'.repeat(prefixLength) + ) +} + +function removeManagedBlock(content: string, block: string, prefixLength: 0 | 1 | 2): string { + const index = content.indexOf(block) + if (index < 0) return content + const start = index - prefixLength + let end = index + block.length + if (content[end] === '\n') end += 1 + return `${content.slice(0, start)}${content.slice(end)}` +} + +function escapeBatchLiteral(value: string): string { + return value.replaceAll('%', '%%') +} + +function quotePosixLiteral(value: string): string { + return "'" + value.replaceAll("'", "'\\''") + "'" +} + +function createPosixCommand(source: CliSource): string { + return [ + '#!/bin/sh', + 'set -eu', + 'runtime_node=' + quotePosixLiteral(source.runtimeNode), + 'cli_module=' + quotePosixLiteral(source.modulePath), + 'if [ ! -x "$runtime_node" ] || [ ! -f "$cli_module" ]; then', + ' echo "DeepChat CLI bundled resources are unavailable." >&2', + ' exit 127', + 'fi', + 'exec "$runtime_node" "$cli_module" "$@"', + '' + ].join('\n') +} + +function createWindowsCommand(source: CliSource): string { + const cliModule = escapeBatchLiteral(source.modulePath) + const runtimeNode = escapeBatchLiteral(source.runtimeNode) + return [ + '@echo off', + 'setlocal', + `set "cli_module=${cliModule}"`, + `set "runtime_node=${runtimeNode}"`, + 'if not exist "%runtime_node%" goto missing_runtime', + 'if not exist "%cli_module%" goto missing_runtime', + '"%runtime_node%" "%cli_module%" %*', + 'exit /b %errorlevel%', + ':missing_runtime', + 'echo DeepChat CLI bundled resources are unavailable. 1>&2', + 'exit /b 127', + '' + ].join('\r\n') +} + +function ownedCommandsEqual(left: OwnedCommand | null, right: OwnedCommand | null): boolean { + return ( + left?.kind === right?.kind && + left?.value === right?.value && + (left?.kind !== 'text' || (right?.kind === 'text' && left.executable === right.executable)) + ) +} + +export class CliLauncherService { + private readonly platform: NodeJS.Platform + private operationQueue: Promise = Promise.resolve() + + constructor(private readonly options: CliLauncherServiceOptions) { + this.platform = options.platform ?? process.platform + } + + async getStatus(): Promise { + return await this.runExclusive(() => this.inspectStatus()) + } + + async ensureInstalled(): Promise { + return await this.runExclusive(async () => { + await this.installOrRepair() + return await this.inspectStatus() + }) + } + + async removeOwnedLauncher(): Promise { + return await this.runExclusive(async () => { + await this.uninstall() + return await this.inspectStatus() + }) + } + + private async runExclusive(operation: () => Promise): Promise { + const run = this.operationQueue.then(operation, operation) + this.operationQueue = run.then( + () => undefined, + () => undefined + ) + return await run + } + + private get markerPath(): string { + return path.join(this.options.userDataDirectory, 'local-control', LAUNCHER_MARKER_FILENAME) + } + + private get isSupportedPlatform(): boolean { + return this.platform === 'darwin' || this.platform === 'linux' || this.platform === 'win32' + } + + private get commandPath(): string | null { + if (this.platform === 'darwin' || this.platform === 'linux') { + return path.join(this.options.homeDirectory, '.local', 'bin', 'deepchat') + } + if (this.platform === 'win32') { + const localAppData = + this.options.localAppDataDirectory ?? + path.join(this.options.homeDirectory, 'AppData', 'Local') + return path.join(localAppData, 'Microsoft', 'WindowsApps', 'deepchat.cmd') + } + return null + } + + private async resolveSource(): Promise { + const directory = this.options.resolveCliDirectory() + if (!directory) return null + const resolvedDirectory = path.resolve(directory) + const runtimeExecutable = + this.platform === 'win32' ? path.join('node', 'node.exe') : path.join('node', 'bin', 'node') + const runtimeCandidates = [ + path.resolve(resolvedDirectory, '..', 'runtime', runtimeExecutable), + path.resolve(resolvedDirectory, '..', '..', 'runtime', runtimeExecutable) + ] + let runtimeNode: string | null = null + for (const candidate of runtimeCandidates) { + try { + const stats = await lstat(candidate) + if ( + stats.isFile() && + !stats.isSymbolicLink() && + (this.platform === 'win32' || (stats.mode & 0o111) !== 0) + ) { + runtimeNode = candidate + break + } + } catch (error) { + if (!isMissingFileError(error)) throw error + } + } + if (!runtimeNode) return null + const source: CliSource = { + posixLauncher: path.join(resolvedDirectory, 'deepchat'), + modulePath: path.join(resolvedDirectory, 'deepchat.mjs'), + runtimeNode + } + const requiredPaths = + this.platform === 'win32' ? [source.modulePath] : [source.posixLauncher, source.modulePath] + for (const requiredPath of requiredPaths) { + try { + const stats = await lstat(requiredPath) + if (!stats.isFile() || stats.isSymbolicLink()) return null + if ( + this.platform !== 'win32' && + requiredPath === source.posixLauncher && + (stats.mode & 0o111) === 0 + ) { + return null + } + } catch (error) { + if (isMissingFileError(error)) return null + throw error + } + } + return source + } + + private async inspectStatus(): Promise { + const commandPath = this.commandPath + if (!this.isSupportedPlatform || !commandPath) { + return { + state: 'unavailable', + reason: 'unsupported-platform', + commandPath: null, + shellConfigPath: null + } + } + + const markerResult = await this.readMarker() + if (markerResult.state === 'invalid') { + return { + state: 'conflict', + reason: 'ownership-marker-invalid', + commandPath, + shellConfigPath: null + } + } + + if (markerResult.state === 'missing') { + if (await this.pathEntryExists(commandPath)) { + return { + state: 'conflict', + reason: 'unowned-command', + commandPath, + shellConfigPath: null + } + } + const profileKind = this.platform === 'win32' ? null : await this.selectProfileKind() + const orphanedProfile = await this.findUnownedProfileConflict(profileKind) + if (orphanedProfile && orphanedProfile.blockState !== 'too-large') { + return { + state: 'conflict', + reason: 'unowned-command', + commandPath, + shellConfigPath: null + } + } + if (orphanedProfile?.blockState === 'too-large') { + return { + state: 'unavailable', + reason: 'shell-config-too-large', + commandPath, + shellConfigPath: orphanedProfile.path + } + } + if (this.platform === 'win32' && !this.isCommandDirectoryOnPath()) { + return { + state: 'unavailable', + reason: 'path-unavailable', + commandPath, + shellConfigPath: null + } + } + const source = await this.resolveSource() + return { + state: source ? 'not-installed' : 'unavailable', + reason: source ? null : 'source-missing', + commandPath, + shellConfigPath: null + } + } + + const { marker } = markerResult + const expectedPlatform = this.platform === 'win32' ? 'windows' : 'posix' + if ( + marker.platform !== expectedPlatform || + !pathsEqual(marker.commandPath, commandPath, this.platform) + ) { + return { + state: 'conflict', + reason: 'ownership-marker-invalid', + commandPath, + shellConfigPath: null + } + } + + const profile = + marker.platform === 'posix' ? await this.inspectProfile(marker.profileKind) : null + if (profile?.blockState === 'too-large') { + return { + state: 'unavailable', + reason: 'shell-config-too-large', + commandPath, + shellConfigPath: profile.path + } + } + if ( + profile?.blockState === 'modified' || + (profile?.blockState === 'exact' && + marker.platform === 'posix' && + !hasManagedBlockPrefix( + profile.content, + managedProfileBlock(profile.kind), + marker.profilePrefixLength + )) + ) { + return { + state: 'conflict', + reason: 'shell-config-modified', + commandPath, + shellConfigPath: profile.path + } + } + + const commandState = await this.inspectOwnedCommand(marker) + if (commandState === 'modified') { + return { + state: 'conflict', + reason: 'command-modified', + commandPath, + shellConfigPath: profile?.path ?? null + } + } + + const source = await this.resolveSource() + if (!source) { + return { + state: 'unavailable', + reason: 'source-missing', + commandPath, + shellConfigPath: profile?.path ?? null + } + } + if (commandState === 'missing') { + return { + state: 'needs-repair', + reason: 'command-missing', + commandPath, + shellConfigPath: profile?.path ?? null + } + } + if (profile?.blockState === 'missing') { + return { + state: 'needs-repair', + reason: 'shell-config-missing', + commandPath, + shellConfigPath: profile.path + } + } + if (this.platform === 'win32' && !this.isCommandDirectoryOnPath()) { + return { + state: 'needs-repair', + reason: 'path-unavailable', + commandPath, + shellConfigPath: null + } + } + const current = this.markerForSource( + source, + marker.platform === 'posix' ? marker.profileKind : null, + marker.platform === 'posix' ? marker.profilePrefixLength : 0, + marker.platform === 'posix' ? marker.profileCreated : false + ) + const stale = + marker.platform === 'posix' + ? marker.commandHash === undefined || + marker.commandHash !== (current as PosixLauncherMarker).commandHash + : marker.commandHash !== (current as WindowsLauncherMarker).commandHash + return { + state: stale ? 'stale' : 'installed', + reason: stale ? 'upgrade-required' : null, + commandPath, + shellConfigPath: profile?.path ?? null + } + } + + private async installOrRepair(): Promise { + if (!this.isSupportedPlatform || !this.commandPath) { + throw new Error('DeepChat CLI launcher installation is not supported on this platform') + } + const source = await this.resolveSource() + if (!source) throw new Error('The bundled DeepChat CLI is unavailable') + if (this.platform === 'win32' && !this.isCommandDirectoryOnPath()) { + throw new Error('The Windows user command directory is not available on PATH') + } + const markerResult = await this.readMarker() + if (markerResult.state === 'invalid') { + throw new Error('The DeepChat CLI ownership marker is invalid') + } + + let previousMarker: LauncherMarker | null = null + let previousMarkerRaw: string | null = null + let profileKind: PosixProfileKind | null = null + if (markerResult.state === 'valid') { + previousMarker = markerResult.marker + previousMarkerRaw = markerResult.raw + const expectedPlatform = this.platform === 'win32' ? 'windows' : 'posix' + if ( + previousMarker.platform !== expectedPlatform || + !pathsEqual(previousMarker.commandPath, this.commandPath, this.platform) + ) { + throw new Error('The DeepChat CLI ownership marker does not match this installation') + } + profileKind = previousMarker.platform === 'posix' ? previousMarker.profileKind : null + } else { + if (await this.pathEntryExists(this.commandPath)) { + throw new Error('A DeepChat CLI command or shell block exists without an ownership marker') + } + profileKind = this.platform === 'win32' ? null : await this.selectProfileKind() + const orphanedProfile = await this.findUnownedProfileConflict(profileKind) + if (orphanedProfile && orphanedProfile.blockState !== 'too-large') { + throw new Error('A DeepChat CLI command or shell block exists without an ownership marker') + } + if (orphanedProfile?.blockState === 'too-large') { + throw new Error('The DeepChat CLI shell configuration exceeds the supported size') + } + } + + const profile = this.platform === 'win32' ? null : await this.inspectProfile(profileKind) + if (profile?.blockState === 'too-large') { + throw new Error('The DeepChat CLI shell configuration exceeds the supported size') + } + if (profile?.blockState === 'modified') { + throw new Error('The managed DeepChat CLI shell block has been modified') + } + + const previousCommand = await this.captureOwnedCommand(previousMarker) + const previousProfileContent = profile?.exists ? profile.content : null + const appendedProfile = + profile && profile.blockState === 'missing' + ? appendManagedBlock(profile.content, managedProfileBlock(profile.kind)) + : null + const profilePrefixLength = + appendedProfile?.prefixLength ?? + (previousMarker?.platform === 'posix' ? previousMarker.profilePrefixLength : 0) + const profileCreated = + previousMarker?.platform === 'posix' + ? previousMarker.profileCreated + : Boolean(profile && !profile.exists) + if ( + profile?.blockState === 'exact' && + previousMarker?.platform === 'posix' && + !hasManagedBlockPrefix( + profile.content, + managedProfileBlock(profile.kind), + previousMarker.profilePrefixLength + ) + ) { + throw new Error('The managed DeepChat CLI shell block prefix has been modified') + } + const nextProfileContent = appendedProfile?.content ?? previousProfileContent + const nextMarker = this.markerForSource( + source, + profileKind, + profilePrefixLength, + profileCreated + ) + const nextMarkerRaw = `${JSON.stringify(nextMarker)}\n` + const nextCommand = this.commandForSource(source) + let commandChanged = false + let profileChanged = false + try { + if (!ownedCommandsEqual(previousCommand, nextCommand)) { + await this.writeOwnedCommand(source, previousCommand) + commandChanged = true + } + if (profile && nextProfileContent !== null && nextProfileContent !== previousProfileContent) { + await this.prepareHomeManagedDirectory(path.dirname(profile.path)) + await this.atomicWriteText(profile.path, nextProfileContent, previousProfileContent, 0o644) + profileChanged = true + } + if (nextMarkerRaw !== previousMarkerRaw) { + await this.writeMarker(nextMarkerRaw, previousMarkerRaw) + } + } catch (error) { + if (profileChanged && profile && nextProfileContent !== null) { + await this.restoreTextFile(profile.path, previousProfileContent, nextProfileContent).catch( + () => undefined + ) + } + if (commandChanged) { + await this.restoreOwnedCommand(previousCommand, nextCommand).catch(() => undefined) + } + throw error + } + } + + private async uninstall(): Promise { + const commandPath = this.commandPath + if (!this.isSupportedPlatform || !commandPath) { + throw new Error('DeepChat CLI launcher removal is not supported on this platform') + } + const markerResult = await this.readMarker() + if (markerResult.state === 'invalid') { + throw new Error('The DeepChat CLI ownership marker is invalid') + } + if (markerResult.state === 'missing') { + if (await this.pathEntryExists(commandPath)) { + throw new Error('Refusing to remove a CLI command without an ownership marker') + } + const profileKind = this.platform === 'win32' ? null : await this.selectProfileKind() + const orphanedProfile = await this.findUnownedProfileConflict(profileKind) + if (orphanedProfile && orphanedProfile.blockState !== 'too-large') { + throw new Error('Refusing to remove a CLI command without an ownership marker') + } + if (orphanedProfile?.blockState === 'too-large') { + throw new Error( + 'Cannot inspect the DeepChat CLI shell configuration because it is too large' + ) + } + return + } + + const { marker, raw: markerRaw } = markerResult + const expectedPlatform = this.platform === 'win32' ? 'windows' : 'posix' + if ( + marker.platform !== expectedPlatform || + !pathsEqual(marker.commandPath, commandPath, this.platform) + ) { + throw new Error('The DeepChat CLI ownership marker does not match this installation') + } + const profile = + marker.platform === 'posix' ? await this.inspectProfile(marker.profileKind) : null + if (profile?.blockState === 'too-large') { + throw new Error('Cannot inspect the DeepChat CLI shell configuration because it is too large') + } + if ( + profile?.blockState === 'modified' || + (profile?.blockState === 'exact' && + marker.platform === 'posix' && + !hasManagedBlockPrefix( + profile.content, + managedProfileBlock(profile.kind), + marker.profilePrefixLength + )) + ) { + throw new Error('Refusing to edit a modified DeepChat CLI shell block') + } + const previousCommand = await this.captureOwnedCommand(marker) + const previousProfileContent = profile?.exists ? profile.content : null + const nextProfileContent = + profile?.blockState === 'exact' && marker.platform === 'posix' + ? removeManagedBlock( + profile.content, + managedProfileBlock(profile.kind), + marker.profilePrefixLength + ) + : previousProfileContent + let commandRemoved = false + let profileChanged = false + let profileRemoved = false + try { + if (previousCommand !== null) { + await this.removeOwnedCommand(previousCommand) + commandRemoved = true + } + if (profile && nextProfileContent !== null && nextProfileContent !== previousProfileContent) { + await this.prepareHomeManagedDirectory(path.dirname(profile.path)) + if (marker.platform === 'posix' && marker.profileCreated && nextProfileContent === '') { + await this.unlinkTextIfMatches(profile.path, previousProfileContent ?? '') + profileRemoved = true + } else { + await this.atomicWriteText( + profile.path, + nextProfileContent, + previousProfileContent, + 0o644 + ) + } + profileChanged = true + } + await this.removeMarker(markerRaw) + } catch (error) { + if (profileChanged && profile && nextProfileContent !== null) { + await this.restoreTextFile( + profile.path, + previousProfileContent, + profileRemoved ? null : nextProfileContent + ).catch(() => undefined) + } + if (commandRemoved) { + await this.restoreOwnedCommand(previousCommand, null).catch(() => undefined) + } + throw error + } + } + + private async selectProfileKind(): Promise { + if (this.isCommandDirectoryOnPath()) return null + const fallbackShell = + this.platform === 'darwin' ? 'zsh' : this.platform === 'linux' ? 'bash' : '' + switch (path.basename(this.options.shell ?? fallbackShell)) { + case 'zsh': + return 'zsh' + case 'bash': + if (this.platform === 'darwin') { + if (await this.pathEntryExists(path.join(this.options.homeDirectory, '.bash_profile'))) { + return 'bash' + } + if (await this.pathEntryExists(path.join(this.options.homeDirectory, '.bash_login'))) { + return 'bash-login' + } + return 'profile' + } + return 'bash' + case 'fish': + return 'fish' + default: + return 'profile' + } + } + + private isCommandDirectoryOnPath(): boolean { + const commandPath = this.commandPath + if (!commandPath) return false + const commandDirectory = path.resolve(path.dirname(commandPath)) + const delimiter = this.platform === 'win32' ? ';' : ':' + return (this.options.environmentPath ?? '').split(delimiter).some((entry) => { + if (!entry) return false + const candidate = path.resolve(entry.replace(/^"|"$/g, '')) + return this.platform === 'win32' + ? candidate.toLowerCase() === commandDirectory.toLowerCase() + : candidate === commandDirectory + }) + } + + private profilePath(kind: PosixProfileKind): string { + switch (kind) { + case 'zsh': + return path.join( + this.options.homeDirectory, + this.platform === 'darwin' ? '.zprofile' : '.zshrc' + ) + case 'bash': + return path.join( + this.options.homeDirectory, + this.platform === 'darwin' ? '.bash_profile' : '.bashrc' + ) + case 'bash-login': + return path.join(this.options.homeDirectory, '.bash_login') + case 'fish': + return path.join( + this.options.homeDirectory, + '.config', + 'fish', + 'conf.d', + 'deepchat-cli.fish' + ) + case 'profile': + return path.join(this.options.homeDirectory, '.profile') + } + } + + private async inspectProfile(kind: PosixProfileKind | null): Promise { + if (!kind) return null + const profilePath = this.profilePath(kind) + if (!isPathWithin(this.options.homeDirectory, profilePath)) { + throw new Error('Shell configuration path is outside the user home directory') + } + let content = '' + let exists = false + try { + const stats = await lstat(profilePath) + if (!stats.isFile() || stats.isSymbolicLink()) { + return { kind, path: profilePath, content, exists: true, blockState: 'modified' } + } + if (stats.size > MAX_SHELL_CONFIG_BYTES) { + return { kind, path: profilePath, content, exists: true, blockState: 'too-large' } + } + content = await readFile(profilePath, 'utf8') + exists = true + } catch (error) { + if (!isMissingFileError(error)) throw error + } + return { + kind, + path: profilePath, + content, + exists, + blockState: inspectManagedBlock(content, managedProfileBlock(kind)) + } + } + + private async findUnownedProfileConflict( + selectedProfileKind: PosixProfileKind | null + ): Promise { + if (this.platform === 'win32') return null + let tooLarge: ProfileInspection | null = null + for (const kind of ['zsh', 'bash', 'bash-login', 'fish', 'profile'] as const) { + const profile = await this.inspectProfile(kind) + if (!profile || profile.blockState === 'missing') continue + if (profile.blockState !== 'too-large') return profile + if (kind === selectedProfileKind) tooLarge = profile + } + return tooLarge + } + + private markerForSource( + source: CliSource, + profileKind: PosixProfileKind | null, + profilePrefixLength: 0 | 1 | 2, + profileCreated: boolean + ): LauncherMarker { + const commandPath = this.commandPath + if (!commandPath) throw new Error('CLI launcher command path is unavailable') + if (this.platform === 'win32') { + return { + version: LAUNCHER_MARKER_VERSION, + platform: 'windows', + commandPath, + commandHash: sha256(createWindowsCommand(source)) + } + } + return { + version: LAUNCHER_MARKER_VERSION, + platform: 'posix', + commandPath, + launcherTarget: source.posixLauncher, + commandHash: sha256(createPosixCommand(source)), + profileKind, + profilePrefixLength, + profileCreated + } + } + + private async inspectOwnedCommand( + marker: LauncherMarker + ): Promise<'current' | 'missing' | 'modified'> { + try { + const command = await this.readOwnedCommand() + if (command === null) return 'missing' + return this.commandMatchesMarker(command, marker) ? 'current' : 'modified' + } catch { + return 'modified' + } + } + + private commandMatchesMarker(command: OwnedCommand, marker: LauncherMarker): boolean { + if (marker.platform === 'windows') { + return command.kind === 'text' && sha256(command.value) === marker.commandHash + } + if (marker.commandHash !== undefined) { + return ( + command.kind === 'text' && + command.executable && + sha256(command.value) === marker.commandHash + ) + } + return command.kind === 'link' && command.value === path.resolve(marker.launcherTarget) + } + + private async captureOwnedCommand(marker: LauncherMarker | null): Promise { + const command = await this.readOwnedCommand() + if (command === null) return null + if (!marker || !this.commandMatchesMarker(command, marker)) { + throw new Error('Refusing to replace an unowned DeepChat CLI command') + } + return command + } + + private async writeOwnedCommand( + source: CliSource, + previousCommand: OwnedCommand | null + ): Promise { + const commandPath = this.commandPath + if (!commandPath) throw new Error('CLI launcher command path is unavailable') + await this.prepareCommandDirectory(path.dirname(commandPath)) + if (this.platform === 'win32') { + if (previousCommand?.kind === 'link') { + throw new Error('Windows CLI launcher cannot replace a symbolic link') + } + await this.atomicWriteText( + commandPath, + createWindowsCommand(source), + previousCommand?.value ?? null, + 0o755 + ) + return + } + await this.atomicWritePosixCommand( + { kind: 'text', value: createPosixCommand(source), executable: true }, + previousCommand + ) + } + + private commandForSource(source: CliSource): OwnedCommand { + return { + kind: 'text', + value: this.platform === 'win32' ? createWindowsCommand(source) : createPosixCommand(source), + executable: true + } + } + + private async restoreOwnedCommand( + previousCommand: OwnedCommand | null, + expectedCurrent: OwnedCommand | null + ): Promise { + const commandPath = this.commandPath + if (!commandPath) return + if (this.platform !== 'win32') { + if (previousCommand === null) { + if (expectedCurrent !== null) await this.unlinkPosixCommandIfMatches(expectedCurrent) + } else { + await this.atomicWritePosixCommand(previousCommand, expectedCurrent) + } + return + } + if (previousCommand?.kind === 'link' || expectedCurrent?.kind === 'link') { + throw new Error('Windows CLI launcher cannot restore a symbolic link') + } + if (previousCommand === null) { + if (expectedCurrent !== null) { + await this.unlinkTextIfMatches(commandPath, expectedCurrent.value) + } + return + } + await this.atomicWriteText( + commandPath, + previousCommand.value, + expectedCurrent?.value ?? null, + 0o755 + ) + } + + private async removeOwnedCommand(previousCommand: OwnedCommand): Promise { + const commandPath = this.commandPath + if (!commandPath) return + if (this.platform === 'win32') { + if (previousCommand.kind !== 'text') { + throw new Error('Windows CLI launcher cannot remove a symbolic link') + } + await this.unlinkTextIfMatches(commandPath, previousCommand.value) + } else { + await this.unlinkPosixCommandIfMatches(previousCommand) + } + } + + private async readOwnedCommand(): Promise { + if (this.platform === 'win32') { + const content = await this.readWindowsCommand() + return content === null ? null : { kind: 'text', value: content, executable: true } + } + return await this.readPosixCommand() + } + + private async readPosixCommand(): Promise { + const commandPath = this.commandPath + if (!commandPath) return null + try { + const stats = await lstat(commandPath) + if (stats.isSymbolicLink()) { + const target = await readlink(commandPath) + return { kind: 'link', value: path.resolve(path.dirname(commandPath), target) } + } + if (!stats.isFile() || stats.size > 64 * 1024) { + throw new Error('DeepChat CLI command is not an owned launcher') + } + return { + kind: 'text', + value: await readFile(commandPath, 'utf8'), + executable: (stats.mode & 0o111) !== 0 + } + } catch (error) { + if (isMissingFileError(error)) return null + throw error + } + } + + private async readWindowsCommand(): Promise { + const commandPath = this.commandPath + if (!commandPath) return null + try { + const stats = await lstat(commandPath) + if (!stats.isFile() || stats.isSymbolicLink() || stats.size > 64 * 1024) { + throw new Error('DeepChat CLI command is not an owned launcher file') + } + return await readFile(commandPath, 'utf8') + } catch (error) { + if (isMissingFileError(error)) return null + throw error + } + } + + private async prepareCommandDirectory(directory: string): Promise { + if (this.platform !== 'win32') { + await this.prepareHomeManagedDirectory(directory) + return + } + await mkdir(directory, { recursive: true, mode: 0o755 }) + const stats = await lstat(directory) + if (!stats.isDirectory() || stats.isSymbolicLink()) { + throw new Error('CLI launcher directory is not a real directory') + } + } + + private async prepareHomeManagedDirectory(directory: string): Promise { + await mkdir(directory, { recursive: true, mode: 0o755 }) + const stats = await lstat(directory) + if (!stats.isDirectory() || stats.isSymbolicLink()) { + throw new Error('Managed user directory is not a real directory') + } + const [physicalHome, physicalDirectory] = await Promise.all([ + realpath(this.options.homeDirectory), + realpath(directory) + ]) + if (!isPathWithin(physicalHome, physicalDirectory)) { + throw new Error('Managed user directory is outside the user home directory') + } + } + + private async atomicWritePosixCommand( + command: OwnedCommand, + expectedCommand: OwnedCommand | null + ): Promise { + const commandPath = this.commandPath + if (!commandPath) throw new Error('CLI launcher command path is unavailable') + const currentCommand = await this.readPosixCommand() + if (!ownedCommandsEqual(currentCommand, expectedCommand)) { + throw new Error('CLI launcher changed during installation') + } + const tempPath = path.join(path.dirname(commandPath), `.deepchat-${randomUUID()}.tmp`) + try { + if (command.kind === 'link') { + await symlink(command.value, tempPath) + } else { + await writeFile(tempPath, command.value, { + encoding: 'utf8', + flag: 'wx', + mode: 0o755 + }) + await chmod(tempPath, 0o755) + } + const verifiedCommand = await this.readPosixCommand() + if (!ownedCommandsEqual(verifiedCommand, currentCommand)) { + throw new Error('CLI launcher changed during installation') + } + await rename(tempPath, commandPath) + } catch (error) { + await unlink(tempPath).catch(() => undefined) + throw error + } + } + + private async atomicWriteText( + filePath: string, + content: string, + expectedContent: string | null, + mode: number + ): Promise { + await mkdir(path.dirname(filePath), { recursive: true, mode: 0o755 }) + const currentContent = await this.readRegularText( + filePath, + Math.max(MAX_SHELL_CONFIG_BYTES, 64 * 1024) + ) + if (currentContent !== expectedContent) throw new Error('Managed file changed during operation') + const tempPath = path.join(path.dirname(filePath), `.deepchat-${randomUUID()}.tmp`) + try { + await writeFile(tempPath, content, { encoding: 'utf8', flag: 'wx', mode }) + if (this.platform !== 'win32') await chmod(tempPath, mode) + const verifiedContent = await this.readRegularText( + filePath, + Math.max(MAX_SHELL_CONFIG_BYTES, 64 * 1024) + ) + if (verifiedContent !== currentContent) + throw new Error('Managed file changed during operation') + await rename(tempPath, filePath) + } catch (error) { + await unlink(tempPath).catch(() => undefined) + throw error + } + } + + private async restoreTextFile( + filePath: string, + previousContent: string | null, + currentContent: string | null + ): Promise { + if (previousContent === null) { + if (currentContent === null) return + await this.unlinkTextIfMatches(filePath, currentContent) + return + } + await this.atomicWriteText(filePath, previousContent, currentContent, 0o644) + } + + private async readRegularText(filePath: string, maxBytes: number): Promise { + try { + const stats = await lstat(filePath) + if (!stats.isFile() || stats.isSymbolicLink() || stats.size > maxBytes) { + throw new Error('Managed path is not a supported regular file') + } + return await readFile(filePath, 'utf8') + } catch (error) { + if (isMissingFileError(error)) return null + throw error + } + } + + private async unlinkPosixCommandIfMatches(expectedCommand: OwnedCommand): Promise { + const commandPath = this.commandPath + if (!commandPath) return + const currentCommand = await this.readPosixCommand() + if (!ownedCommandsEqual(currentCommand, expectedCommand)) { + throw new Error('Refusing to remove a changed CLI launcher') + } + await unlink(commandPath) + } + + private async unlinkTextIfMatches(filePath: string, expectedContent: string): Promise { + const currentContent = await this.readRegularText(filePath, 64 * 1024) + if (currentContent !== expectedContent) { + throw new Error('Refusing to remove a changed CLI launcher') + } + await unlink(filePath) + } + + private async pathEntryExists(filePath: string): Promise { + try { + await lstat(filePath) + return true + } catch (error) { + if (isMissingFileError(error)) return false + throw error + } + } + + private async readMarker(): Promise { + try { + const directory = path.dirname(this.markerPath) + const directoryStats = await lstat(directory) + if (!directoryStats.isDirectory() || directoryStats.isSymbolicLink()) { + return { state: 'invalid', raw: '' } + } + const [physicalUserData, physicalDirectory] = await Promise.all([ + realpath(this.options.userDataDirectory), + realpath(directory) + ]) + if (!isPathWithin(physicalUserData, physicalDirectory)) { + return { state: 'invalid', raw: '' } + } + const stats = await lstat(this.markerPath) + if (!stats.isFile() || stats.isSymbolicLink() || stats.size > MAX_MARKER_BYTES) { + return { state: 'invalid', raw: '' } + } + const raw = await readFile(this.markerPath, 'utf8') + const marker = parseLauncherMarker(JSON.parse(raw)) + return marker ? { state: 'valid', raw, marker } : { state: 'invalid', raw } + } catch (error) { + if (isMissingFileError(error)) return { state: 'missing', raw: null } + if (error instanceof SyntaxError) return { state: 'invalid', raw: '' } + throw error + } + } + + private async writeMarker(content: string, expectedContent: string | null): Promise { + const directory = path.dirname(this.markerPath) + await mkdir(directory, { recursive: true, mode: 0o700 }) + const directoryStats = await lstat(directory) + if (!directoryStats.isDirectory() || directoryStats.isSymbolicLink()) { + throw new Error('CLI launcher ownership directory is not a real directory') + } + const [physicalUserData, physicalDirectory] = await Promise.all([ + realpath(this.options.userDataDirectory), + realpath(directory) + ]) + if (!isPathWithin(physicalUserData, physicalDirectory)) { + throw new Error('CLI launcher ownership directory is outside application data') + } + if (this.platform !== 'win32') await chmod(directory, 0o700) + await this.atomicWriteText(this.markerPath, content, expectedContent, 0o600) + } + + private async removeMarker(expectedContent: string): Promise { + await this.unlinkTextIfMatches(this.markerPath, expectedContent) + } +} diff --git a/src/main/cli/mcpAdminRoutes.ts b/src/main/cli/mcpAdminRoutes.ts new file mode 100644 index 0000000000..c59322b005 --- /dev/null +++ b/src/main/cli/mcpAdminRoutes.ts @@ -0,0 +1,571 @@ +import path from 'node:path' +import { + PUBLIC_MCP_LIST_MAX_ITEMS, + PublicMcpServerNameSchema, + PublicMcpServerSchema, + mcpAddPublicRoute, + mcpListPublicRoute, + mcpRemovePublicRoute, + mcpSetPublicStatusRoute, + mcpStartPublicRoute, + mcpStopPublicRoute, + mcpUpdatePublicRoute, + type PublicMcpServer, + type PublicMcpServerConfigInput, + type PublicMcpServerUpdate, + type SettingsActivityInput +} from '@shared/contracts/routes' +import type { MCPServerConfig, McpServicePort } from '@shared/types/mcp' +import { + createRouteMap, + type CliRouteCaller, + type DeepchatRouteMap, + type RouteCaller +} from '@/routes/routeRegistry' +import { CliRequestError } from './errors' +import { compareStableText, sanitizePublicText } from './publicText' + +const PUBLIC_MCP_DESCRIPTION_BYTES = 1024 +const PUBLIC_MCP_COMMAND_NAME_BYTES = 256 + +type PublicMcpPort = Pick< + McpServicePort, + | 'addMcpServer' + | 'getMcpServers' + | 'isServerRunning' + | 'removeMcpServer' + | 'setMcpServerEnabled' + | 'startServer' + | 'stopServer' + | 'updateMcpServer' +> + +export type CliMcpAdminDependencies = Readonly<{ + mcp: PublicMcpPort + recordSettingsActivity?(input: SettingsActivityInput): void + log?: Pick +}> + +function requireCliCaller(caller: RouteCaller): asserts caller is CliRouteCaller { + if (caller.kind !== 'cli') { + throw new CliRequestError('permission_denied', 'MCP administration requires a CLI caller', { + httpStatus: 403 + }) + } +} + +function requireHumanCliCaller( + caller: RouteCaller +): asserts caller is CliRouteCaller & { principal: 'human' } { + requireCliCaller(caller) + if (caller.principal !== 'human') { + throw new CliRequestError( + 'permission_denied', + 'MCP administration requires a human CLI caller', + { + httpStatus: 403 + } + ) + } +} + +function isPluginOwned(config: MCPServerConfig): boolean { + return Boolean(config.ownerPluginId || config.source === 'plugin') +} + +function boundedCount(value: number): Readonly<{ value: number; truncated: boolean }> { + return { + value: Math.min(value, 1_000_000), + truncated: value > 1_000_000 + } +} + +function commandBasename(command: string): string { + return path.posix.basename(path.win32.basename(command)) +} + +function endpointSummary(baseUrl: string | undefined): { + value: PublicMcpServer['endpoint'] + truncated: boolean +} { + if (!baseUrl) return { value: null, truncated: false } + try { + const url = new URL(baseUrl) + return { + value: { + origin: url.origin, + pathPresent: url.pathname !== '/' || Boolean(url.search) + }, + truncated: false + } + } catch { + return { value: null, truncated: true } + } +} + +function toPublicMcpServer( + serverName: string, + config: MCPServerConfig, + running: boolean | null +): PublicMcpServer | null { + const parsedName = PublicMcpServerNameSchema.safeParse(serverName) + if (!parsedName.success) return null + + const description = sanitizePublicText(config.descriptions, PUBLIC_MCP_DESCRIPTION_BYTES) + const rawCommandName = + config.type === 'stdio' && typeof config.command === 'string' + ? commandBasename(config.command) + : '' + const commandName = rawCommandName + ? sanitizePublicText(rawCommandName, PUBLIC_MCP_COMMAND_NAME_BYTES) + : { value: '', truncated: false } + const endpoint = endpointSummary(config.baseUrl) + const argumentCount = boundedCount(Array.isArray(config.args) ? config.args.length : 0) + const environmentEntryCount = boundedCount( + config.env && typeof config.env === 'object' ? Object.keys(config.env).length : 0 + ) + const headerEntryCount = boundedCount( + config.customHeaders && typeof config.customHeaders === 'object' + ? Object.keys(config.customHeaders).length + : 0 + ) + const pluginOwned = isPluginOwned(config) + + const parsed = PublicMcpServerSchema.safeParse({ + name: parsedName.data, + type: config.type, + enabled: config.enabled, + running, + managedBy: pluginOwned ? 'plugin' : config.type === 'inmemory' ? 'deepchat' : 'user', + editable: !pluginOwned && config.type !== 'inmemory', + removable: !pluginOwned && config.type !== 'inmemory', + description: description.value, + commandName: commandName.value || null, + endpoint: endpoint.value, + argumentCount: argumentCount.value, + environmentEntryCount: environmentEntryCount.value, + headerEntryCount: headerEntryCount.value, + authorizationMode: config.authorization?.mode ?? null, + metadataTruncated: + description.truncated || + commandName.truncated || + endpoint.truncated || + argumentCount.truncated || + environmentEntryCount.truncated || + headerEntryCount.truncated + }) + return parsed.success ? parsed.data : null +} + +function toStoredConfig(input: PublicMcpServerConfigInput): MCPServerConfig { + const common = { + descriptions: input.description, + icons: input.icon, + enabled: false, + type: input.type + } as const + if (input.type === 'stdio') { + return { + ...common, + command: input.command, + args: input.args, + env: input.environment, + inheritEnv: input.inheritEnv, + ...(input.customNpmRegistry ? { customNpmRegistry: input.customNpmRegistry } : {}) + } + } + return { + ...common, + command: '', + args: [], + env: {}, + baseUrl: input.baseUrl, + customHeaders: input.headers, + ...(input.type === 'http' && input.authorization ? { authorization: input.authorization } : {}) + } +} + +function hasOwn(value: object, key: string): boolean { + return Object.prototype.hasOwnProperty.call(value, key) +} + +function toStoredUpdate( + current: MCPServerConfig, + updates: PublicMcpServerUpdate +): Partial { + const targetType = updates.type ?? current.type + if (targetType === 'inmemory') { + throw new CliRequestError( + 'conflict', + 'In-memory MCP servers cannot be edited through the CLI', + { + httpStatus: 409 + } + ) + } + + const stdioOnlyFields = ['command', 'args', 'environment', 'inheritEnv', 'customNpmRegistry'] + const remoteOnlyFields = ['baseUrl', 'headers', 'authorization'] + const invalidField = (targetType === 'stdio' ? remoteOnlyFields : stdioOnlyFields).find((field) => + hasOwn(updates, field) + ) + if (invalidField) { + throw new CliRequestError( + 'invalid_request', + `${invalidField} is not valid for MCP transport ${targetType}` + ) + } + if (targetType === 'sse' && hasOwn(updates, 'authorization')) { + throw new CliRequestError('invalid_request', 'authorization is only valid for HTTP MCP servers') + } + + const typeChanged = targetType !== current.type + if (typeChanged && targetType === 'stdio' && updates.command === undefined) { + throw new CliRequestError('invalid_request', 'Changing an MCP server to stdio requires command') + } + if (typeChanged && targetType !== 'stdio' && updates.baseUrl === undefined) { + throw new CliRequestError( + 'invalid_request', + 'Changing an MCP server to a remote transport requires baseUrl' + ) + } + + const stored: Partial = { + ...(updates.description !== undefined ? { descriptions: updates.description } : {}), + ...(updates.icon !== undefined ? { icons: updates.icon } : {}) + } + if (typeChanged) { + stored.type = targetType + if (targetType === 'stdio') { + stored.command = updates.command! + stored.args = updates.args ?? [] + stored.env = updates.environment ?? {} + stored.inheritEnv = updates.inheritEnv ?? 'minimal' + stored.customNpmRegistry = updates.customNpmRegistry ?? undefined + stored.baseUrl = undefined + stored.customHeaders = undefined + stored.authorization = undefined + } else { + stored.command = '' + stored.args = [] + stored.env = {} + stored.inheritEnv = undefined + stored.customNpmRegistry = undefined + stored.baseUrl = updates.baseUrl! + stored.customHeaders = updates.headers ?? {} + stored.authorization = updates.authorization ?? undefined + } + return stored + } + + if (updates.command !== undefined) stored.command = updates.command + if (updates.args !== undefined) stored.args = updates.args + if (updates.environment !== undefined) stored.env = updates.environment + if (updates.inheritEnv !== undefined) stored.inheritEnv = updates.inheritEnv + if (hasOwn(updates, 'customNpmRegistry')) { + stored.customNpmRegistry = updates.customNpmRegistry ?? undefined + } + if (updates.baseUrl !== undefined) stored.baseUrl = updates.baseUrl + if (updates.headers !== undefined) stored.customHeaders = updates.headers + if (hasOwn(updates, 'authorization')) { + stored.authorization = updates.authorization ?? undefined + } + return stored +} + +export function createCliMcpAdminRoutes(dependencies: CliMcpAdminDependencies): DeepchatRouteMap { + const log = dependencies.log ?? console + const unavailable = (action: string, error: unknown): CliRequestError => { + log.warn(`[CLI] Failed to ${action}`, { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + return new CliRequestError('unavailable', `Could not ${action}`, { + httpStatus: 503, + retriable: true + }) + } + const loadServers = async (): Promise> => { + try { + return await dependencies.mcp.getMcpServers() + } catch (error) { + throw unavailable('read MCP servers', error) + } + } + const requireUserServer = async ( + serverName: string + ): Promise> => { + const config = (await loadServers())[serverName] + if (!config) { + throw new CliRequestError('not_found', 'MCP server was not found', { httpStatus: 404 }) + } + if (isPluginOwned(config)) { + throw new CliRequestError('conflict', 'Plugin-owned MCP server cannot be edited', { + httpStatus: 409 + }) + } + if (config.type === 'inmemory') { + throw new CliRequestError('conflict', 'In-memory MCP server cannot be edited', { + httpStatus: 409 + }) + } + if (config.type !== 'stdio' && config.type !== 'sse' && config.type !== 'http') { + throw new CliRequestError('conflict', 'MCP server uses an unsupported transport', { + httpStatus: 409 + }) + } + return { config } + } + const readRunning = async (serverName: string): Promise => { + try { + return await dependencies.mcp.isServerRunning(serverName) + } catch { + return null + } + } + const summarizeServer = async ( + serverName: string, + config: MCPServerConfig + ): Promise => { + const server = toPublicMcpServer(serverName, config, await readRunning(serverName)) + if (!server) { + throw new CliRequestError('internal_error', 'MCP server has invalid public metadata', { + httpStatus: 500 + }) + } + return server + } + const summarizeAppliedServer = async (serverName: string): Promise => { + try { + const config = (await dependencies.mcp.getMcpServers())[serverName] + if (!config) throw new Error('Persisted MCP server is missing after mutation') + return await summarizeServer(serverName, config) + } catch (error) { + log.warn('[CLI] Could not confirm MCP state after a successful mutation', { + serverName, + failure: { name: error instanceof Error ? error.name : typeof error } + }) + throw new CliRequestError( + 'unavailable', + 'MCP mutation completed, but persisted state could not be confirmed', + { + httpStatus: 503, + retriable: false, + details: { serverName, applied: true } + } + ) + } + } + const recordActivity = ( + action: SettingsActivityInput['action'], + serverName: string, + summaryKey: string + ): void => { + try { + dependencies.recordSettingsActivity?.({ + category: 'mcp', + action, + targetType: 'mcp-server', + targetId: serverName, + targetLabel: serverName, + routeName: 'settings-mcp', + summaryKey, + summaryParams: { name: serverName } + }) + } catch (error) { + log.warn('[CLI] Failed to record MCP activity', { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + } + } + + return createRouteMap([ + [ + mcpListPublicRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + mcpListPublicRoute.input.parse(rawInput) + const entries = Object.entries(await loadServers()) + const selected = entries + .filter(([serverName]) => PublicMcpServerNameSchema.safeParse(serverName).success) + .sort(([left], [right]) => compareStableText(left, right)) + .slice(0, PUBLIC_MCP_LIST_MAX_ITEMS) + const servers = await Promise.all( + selected.map(async ([serverName, config]) => { + return toPublicMcpServer(serverName, config, await readRunning(serverName)) + }) + ) + const publicServers = servers.filter((server): server is PublicMcpServer => server !== null) + return mcpListPublicRoute.output.parse({ + servers: publicServers, + truncated: entries.length > publicServers.length + }) + } + ], + [ + mcpAddPublicRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = mcpAddPublicRoute.input.parse(rawInput) + const storedConfig = toStoredConfig(input.config) + let result: Awaited> + try { + result = await dependencies.mcp.addMcpServer(input.serverName, storedConfig) + } catch (error) { + throw unavailable('add the MCP server', error) + } + if (result.status === 'duplicate') { + throw new CliRequestError('conflict', 'MCP server name is already in use', { + httpStatus: 409 + }) + } + recordActivity( + 'created', + input.serverName, + 'settings.controlCenter.activity.mcpServerCreated' + ) + return mcpAddPublicRoute.output.parse({ + server: await summarizeAppliedServer(input.serverName) + }) + } + ], + [ + mcpUpdatePublicRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = mcpUpdatePublicRoute.input.parse(rawInput) + const current = await requireUserServer(input.serverName) + const storedUpdate = toStoredUpdate(current.config, input.updates) + try { + await dependencies.mcp.updateMcpServer(input.serverName, storedUpdate) + } catch (error) { + throw unavailable('update the MCP server', error) + } + recordActivity( + 'updated', + input.serverName, + 'settings.controlCenter.activity.mcpServerUpdated' + ) + return mcpUpdatePublicRoute.output.parse({ + server: await summarizeAppliedServer(input.serverName) + }) + } + ], + [ + mcpSetPublicStatusRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = mcpSetPublicStatusRoute.input.parse(rawInput) + const current = await requireUserServer(input.serverName) + try { + await dependencies.mcp.setMcpServerEnabled(input.serverName, input.enabled) + } catch (error) { + let persisted: MCPServerConfig | undefined + try { + persisted = (await dependencies.mcp.getMcpServers())[input.serverName] + } catch { + persisted = undefined + } + const running = await readRunning(input.serverName) + if (persisted?.enabled === input.enabled && current.config.enabled !== input.enabled) { + recordActivity( + input.enabled ? 'enabled' : 'disabled', + input.serverName, + 'settings.controlCenter.activity.mcpServerStatusChanged' + ) + } + log.warn('[CLI] MCP enablement changed incompletely', { + serverName: input.serverName, + enabled: persisted?.enabled ?? null, + running, + failure: { name: error instanceof Error ? error.name : typeof error } + }) + throw new CliRequestError( + 'unavailable', + 'MCP runtime transition failed; inspect the reported persisted state', + { + httpStatus: 503, + retriable: true, + details: { + serverName: input.serverName, + enabled: persisted?.enabled ?? null, + running + } + } + ) + } + recordActivity( + input.enabled ? 'enabled' : 'disabled', + input.serverName, + 'settings.controlCenter.activity.mcpServerStatusChanged' + ) + return mcpSetPublicStatusRoute.output.parse({ + server: await summarizeAppliedServer(input.serverName) + }) + } + ], + [ + mcpStartPublicRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = mcpStartPublicRoute.input.parse(rawInput) + const current = await requireUserServer(input.serverName) + try { + await dependencies.mcp.startServer(input.serverName) + } catch (error) { + throw unavailable('start the MCP server', error) + } + recordActivity( + 'enabled', + input.serverName, + 'settings.controlCenter.activity.mcpServerStarted' + ) + return mcpStartPublicRoute.output.parse({ + server: await summarizeServer(input.serverName, current.config) + }) + } + ], + [ + mcpStopPublicRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = mcpStopPublicRoute.input.parse(rawInput) + const current = await requireUserServer(input.serverName) + try { + await dependencies.mcp.stopServer(input.serverName) + } catch (error) { + throw unavailable('stop the MCP server', error) + } + recordActivity( + 'disabled', + input.serverName, + 'settings.controlCenter.activity.mcpServerStopped' + ) + return mcpStopPublicRoute.output.parse({ + server: await summarizeServer(input.serverName, current.config) + }) + } + ], + [ + mcpRemovePublicRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = mcpRemovePublicRoute.input.parse(rawInput) + await requireUserServer(input.serverName) + try { + await dependencies.mcp.removeMcpServer(input.serverName) + } catch (error) { + throw unavailable('remove the MCP server', error) + } + recordActivity( + 'removed', + input.serverName, + 'settings.controlCenter.activity.mcpServerRemoved' + ) + return mcpRemovePublicRoute.output.parse({ + serverName: input.serverName, + removed: true + }) + } + ] + ]) +} diff --git a/src/main/cli/mediaOutput.ts b/src/main/cli/mediaOutput.ts new file mode 100644 index 0000000000..7ec602b297 --- /dev/null +++ b/src/main/cli/mediaOutput.ts @@ -0,0 +1,233 @@ +import { lstat, open } from 'node:fs/promises' +import path from 'node:path' +import { ArtifactMetadataSchema } from '@shared/contracts/routes/artifacts.routes' +import { CliRequestError } from './errors' + +const MAX_GENERATED_MEDIA_BYTES = 512 * 1024 * 1024 +const MAX_ENCODED_MEDIA_CHARACTERS = Math.ceil(MAX_GENERATED_MEDIA_BYTES / 3) * 4 +const BASE64_CHUNK_CHARACTERS = 1024 * 1024 +const MAX_DATA_URL_HEADER_CHARACTERS = 512 +const BASE64_ALPHABET_PATTERN = /^[A-Za-z0-9+/]+$/ +const CACHE_FILENAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,254}$/ +const WINDOWS_DEVICE_NAME_PATTERN = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i + +export type GeneratedMediaKind = 'image' | 'video' | 'audio' + +export type ResolvedGeneratedMedia = Readonly<{ + mimeType: string + data: AsyncIterable + expectedBytes: number + dispose?: () => Promise +}> + +function normalizeMimeType(value: string, kind: GeneratedMediaKind): string { + const mimeType = ArtifactMetadataSchema.shape.mimeType.parse(value.trim().toLowerCase()) + if (!mimeType.startsWith(`${kind}/`)) { + throw new CliRequestError('unavailable', `Provider returned invalid ${kind} output`, { + httpStatus: 503, + retriable: true + }) + } + return mimeType +} + +function decodeUriPath(value: string): string { + try { + return decodeURIComponent(value) + } catch { + throw new CliRequestError('unavailable', 'Provider returned an invalid cached media path', { + httpStatus: 503 + }) + } +} + +function decodedBase64Length(value: string): number { + const padding = value.endsWith('==') ? 2 : value.endsWith('=') ? 1 : 0 + return (value.length / 4) * 3 - padding +} + +function malformedMediaData(): CliRequestError { + return new CliRequestError('unavailable', 'Provider returned malformed media data', { + httpStatus: 503 + }) +} + +async function* decodeBase64(value: string): AsyncGenerator { + for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_CHARACTERS) { + const end = Math.min(value.length, offset + BASE64_CHUNK_CHARACTERS) + const chunk = value.slice(offset, end) + const isFinalChunk = end === value.length + const padding = isFinalChunk ? (chunk.endsWith('==') ? 2 : chunk.endsWith('=') ? 1 : 0) : 0 + const alphabet = padding > 0 ? chunk.slice(0, -padding) : chunk + if (!alphabet || !BASE64_ALPHABET_PATTERN.test(alphabet)) throw malformedMediaData() + yield Buffer.from(chunk, 'base64') + } +} + +function resolveBase64( + rawValue: string, + claimedMimeType: string, + kind: GeneratedMediaKind +): ResolvedGeneratedMedia { + let encoded = rawValue.trim() + let mimeType = claimedMimeType + if (encoded.startsWith('data:')) { + const header = encoded.slice(0, MAX_DATA_URL_HEADER_CHARACTERS) + const commaIndex = header.indexOf(',') + const descriptor = commaIndex > 5 ? header.slice(5, commaIndex) : '' + const base64Suffix = ';base64' + if (!descriptor.toLowerCase().endsWith(base64Suffix)) throw malformedMediaData() + const dataMimeType = normalizeMimeType(descriptor.slice(0, -base64Suffix.length), kind) + const claimed = normalizeMimeType(claimedMimeType, kind) + if (dataMimeType.split(';', 1)[0] !== claimed.split(';', 1)[0]) { + throw new CliRequestError('unavailable', 'Provider returned conflicting media types', { + httpStatus: 503 + }) + } + mimeType = dataMimeType + encoded = encoded.slice(commaIndex + 1) + } + + if (encoded.length > MAX_ENCODED_MEDIA_CHARACTERS) { + throw new CliRequestError('result_too_large', 'Generated media exceeds the byte limit', { + httpStatus: 413 + }) + } + if (!encoded || encoded.length % 4 !== 0) throw malformedMediaData() + if (decodedBase64Length(encoded) > MAX_GENERATED_MEDIA_BYTES) { + throw new CliRequestError('result_too_large', 'Generated media exceeds the byte limit', { + httpStatus: 413 + }) + } + return { + mimeType: normalizeMimeType(mimeType, kind), + data: decodeBase64(encoded), + expectedBytes: decodedBase64Length(encoded) + } +} + +async function resolveCachedImage( + value: string, + claimedMimeType: string, + cacheDirectory: string +): Promise { + const decodedPath = decodeUriPath(value.slice('imgcache://'.length)) + const resolvedCacheDirectory = path.resolve(cacheDirectory) + const cacheDirectoryStat = await lstat(resolvedCacheDirectory).catch(() => null) + if (!cacheDirectoryStat?.isDirectory() || cacheDirectoryStat.isSymbolicLink()) { + throw new CliRequestError('unavailable', 'Generated media cache is unavailable', { + httpStatus: 503, + retriable: true + }) + } + if (typeof process.getuid === 'function' && cacheDirectoryStat.uid !== process.getuid()) { + throw new CliRequestError('unavailable', 'Generated media cache has an invalid owner', { + httpStatus: 503 + }) + } + if (!CACHE_FILENAME_PATTERN.test(decodedPath) || WINDOWS_DEVICE_NAME_PATTERN.test(decodedPath)) { + throw new CliRequestError('unavailable', 'Provider returned an invalid cached media path', { + httpStatus: 503 + }) + } + const filePath = path.resolve(resolvedCacheDirectory, decodedPath) + const relativePath = path.relative(resolvedCacheDirectory, filePath) + if ( + !relativePath || + relativePath.startsWith('..') || + path.isAbsolute(relativePath) || + decodedPath === '.' || + decodedPath === '..' + ) { + throw new CliRequestError('unavailable', 'Provider returned an invalid cached media path', { + httpStatus: 503 + }) + } + + const before = await lstat(filePath).catch(() => null) + if ( + !before?.isFile() || + before.isSymbolicLink() || + before.size <= 0 || + before.size > MAX_GENERATED_MEDIA_BYTES + ) { + throw new CliRequestError('unavailable', 'Generated media cache entry is unavailable', { + httpStatus: 503, + retriable: true + }) + } + const handle = await open(filePath, 'r').catch(() => null) + if (!handle) { + throw new CliRequestError('unavailable', 'Generated media cache entry is unavailable', { + httpStatus: 503, + retriable: true + }) + } + const opened = await handle.stat().catch(() => null) + if ( + !opened?.isFile() || + opened.size !== before.size || + opened.dev !== before.dev || + opened.ino !== before.ino + ) { + await handle.close().catch(() => undefined) + throw new CliRequestError('unavailable', 'Generated media cache entry changed before use', { + httpStatus: 503, + retriable: true + }) + } + try { + const stream = handle.createReadStream({ autoClose: false, end: opened.size - 1 }) + return { + mimeType: normalizeMimeType(claimedMimeType, 'image'), + data: stream, + expectedBytes: opened.size, + dispose: async () => { + if (!stream.destroyed) stream.destroy() + await handle.close().catch(() => undefined) + } + } + } catch (error) { + await handle.close().catch(() => undefined) + throw error + } +} + +export async function resolveGeneratedMedia( + value: string, + claimedMimeType: string, + kind: GeneratedMediaKind, + cacheDirectory: string +): Promise { + if (value.length > MAX_ENCODED_MEDIA_CHARACTERS + 1_024) { + throw new CliRequestError('result_too_large', 'Generated media exceeds the byte limit', { + httpStatus: 413 + }) + } + const normalized = value.trim() + if (!normalized) { + throw new CliRequestError('unavailable', `Provider returned empty ${kind} output`, { + httpStatus: 503, + retriable: true + }) + } + if (normalized.startsWith('imgcache://')) { + if (kind !== 'image') { + throw new CliRequestError( + 'unavailable', + 'Provider returned an invalid media cache reference', + { + httpStatus: 503 + } + ) + } + return await resolveCachedImage(normalized, claimedMimeType, cacheDirectory) + } + if (/^https?:\/\//i.test(normalized)) { + throw new CliRequestError('unavailable', 'Remote generated-media URLs are not accepted', { + httpStatus: 503, + retriable: true + }) + } + return resolveBase64(normalized, claimedMimeType, kind) +} diff --git a/src/main/cli/mutationGuard.ts b/src/main/cli/mutationGuard.ts new file mode 100644 index 0000000000..591f5ce35c --- /dev/null +++ b/src/main/cli/mutationGuard.ts @@ -0,0 +1,225 @@ +import { randomUUID } from 'node:crypto' +import type { DeepchatEventPayload } from '@shared/contracts/events' +import type { LocalControlEffect, LocalControlPrincipal } from '@shared/contracts/localControl' +import type { JsonValue } from '@shared/contracts/json' +import type { RendererRouteCaller } from '@/routes/routeRegistry' +import { ApprovalBroker, ApprovalCapacityError, type ApprovalDecision } from '@/approval' +import { CliRequestError } from './errors' + +const CLI_APPROVAL_DOMAIN = 'cli-mutation' +const DEFAULT_APPROVAL_TIMEOUT_MS = 2 * 60_000 + +export type CliApprovalTarget = Readonly<{ + windowId: number + webContentsId: number +}> + +export type CliApprovalPresentationPort = Readonly<{ + getTarget(): Promise + present( + target: CliApprovalTarget, + payload: DeepchatEventPayload<'approvals.requested'> + ): Promise + close(target: CliApprovalTarget, payload: DeepchatEventPayload<'approvals.closed'>): Promise +}> + +export type CliMutationApprovalInput = Readonly<{ + operation: string + effect: LocalControlEffect + principal: LocalControlPrincipal + connectionId: string + clientRequestId: string + arguments: unknown + displayData?: JsonValue + signal: AbortSignal + timeoutMs?: number +}> + +export type CliMutationApproval = Readonly<{ + approvalRequestId: string +}> + +type PendingTarget = Readonly<{ + scopeKey: string + target: CliApprovalTarget +}> + +function decisionCloseReason( + decision: ApprovalDecision +): DeepchatEventPayload<'approvals.closed'>['reason'] { + if (decision.allowed) return 'approved' + return decision.reason +} + +function signalReason(signal: AbortSignal): Error { + return signal.reason instanceof CliRequestError + ? signal.reason + : new CliRequestError('cancelled', 'Request was cancelled') +} + +function throwIfSignalAborted(signal: AbortSignal): void { + if (signal.aborted) throw signalReason(signal) +} + +export class CliMutationGuard { + private readonly pendingTargets = new Map() + private readonly rendererUnavailableRequests = new Set() + + constructor( + private readonly approvals: ApprovalBroker, + private readonly presentation: CliApprovalPresentationPort + ) {} + + async authorize(input: CliMutationApprovalInput): Promise { + throwIfSignalAborted(input.signal) + const target = await this.presentation.getTarget() + throwIfSignalAborted(input.signal) + if (!target) { + throw new CliRequestError('unavailable', 'No trusted renderer is available for approval', { + httpStatus: 503, + retriable: true + }) + } + + const executionId = randomUUID() + const scopeKey = `cli:${input.connectionId}` + let approvalRequestId: string | undefined + let closeReason: DeepchatEventPayload<'approvals.closed'>['reason'] = 'cancelled' + + try { + const pending = this.approvals.create( + { + domain: CLI_APPROVAL_DOMAIN, + scopeKey, + operation: input.operation, + effect: input.effect, + bindingKey: executionId, + arguments: input.arguments, + ...(input.displayData !== undefined ? { redactedDisplayData: input.displayData } : {}), + metadata: { + targetWebContentsId: target.webContentsId, + clientRequestId: input.clientRequestId + } + }, + { + consumeOnApprove: true, + signal: input.signal, + timeoutMs: input.timeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS + } + ) + approvalRequestId = pending.requestId + this.pendingTargets.set(pending.requestId, { scopeKey, target }) + + let presented: boolean + try { + presented = await this.presentation.present(target, { + requestId: pending.requestId, + operation: input.operation, + effect: input.effect, + principal: input.principal, + expiresAt: pending.expiresAt, + ...(pending.redactedDisplayData !== undefined + ? { displayData: pending.redactedDisplayData } + : {}) + }) + } catch { + presented = false + } + if (!presented) { + closeReason = 'unavailable' + this.approvals.resolve({ + requestId: pending.requestId, + scopeKey, + decision: 'cancelled' + }) + throw new CliRequestError('unavailable', 'Approval renderer became unavailable', { + httpStatus: 503, + retriable: true + }) + } + + const decision = await this.approvals.wait(pending.requestId, input.signal) + closeReason = decisionCloseReason(decision) + if (decision.allowed) { + return { approvalRequestId: pending.requestId } + } + if (decision.reason === 'timeout') { + throw new CliRequestError('approval_timeout', 'Approval request timed out', { + httpStatus: 408, + retriable: true + }) + } + if ( + decision.reason === 'cancelled' && + this.rendererUnavailableRequests.has(pending.requestId) + ) { + closeReason = 'unavailable' + throw new CliRequestError('unavailable', 'Approval renderer became unavailable', { + httpStatus: 503, + retriable: true + }) + } + if (decision.reason === 'cancelled' && input.signal.aborted) { + throw signalReason(input.signal) + } + if (decision.reason === 'cancelled') { + throw new CliRequestError('cancelled', 'Approval request was cancelled', { + retriable: true + }) + } + throw new CliRequestError('approval_denied', 'Approval request was denied', { + httpStatus: 403 + }) + } catch (error) { + if (input.signal.aborted && !(error instanceof CliRequestError)) { + throw signalReason(input.signal) + } + if (error instanceof ApprovalCapacityError) { + throw new CliRequestError('rate_limited', 'Too many pending approval requests', { + httpStatus: 429, + retriable: true + }) + } + throw error + } finally { + if (approvalRequestId) { + this.pendingTargets.delete(approvalRequestId) + this.rendererUnavailableRequests.delete(approvalRequestId) + await this.presentation + .close(target, { requestId: approvalRequestId, reason: closeReason }) + .catch(() => undefined) + } + } + } + + resolve( + input: { requestId: string; decision: 'approved' | 'denied' }, + caller: RendererRouteCaller + ): boolean { + const pending = this.pendingTargets.get(input.requestId) + if (!pending || pending.target.webContentsId !== caller.webContentsId) return false + return this.approvals.resolve({ + requestId: input.requestId, + scopeKey: pending.scopeKey, + decision: input.decision + }) + } + + cancelRenderer(webContentsId: number): void { + for (const [requestId, pending] of this.pendingTargets) { + if (pending.target.webContentsId !== webContentsId) continue + this.rendererUnavailableRequests.add(requestId) + this.approvals.resolve({ + requestId, + scopeKey: pending.scopeKey, + decision: 'cancelled' + }) + } + } + + clear(): void { + this.approvals.clearDomain(CLI_APPROVAL_DOMAIN) + this.pendingTargets.clear() + this.rendererUnavailableRequests.clear() + } +} diff --git a/src/main/cli/ocrService.ts b/src/main/cli/ocrService.ts new file mode 100644 index 0000000000..afb3511772 --- /dev/null +++ b/src/main/cli/ocrService.ts @@ -0,0 +1,397 @@ +import { open } from 'node:fs/promises' +import { + OCR_EXTRACTION_MAX_INPUT_BYTES, + OcrInputMimeTypeSchema, + OcrExtractionOutputSchema, + ocrClearCacheRoute, + ocrExtractArtifactRoute, + ocrExtractUploadRoute, + ocrGetRuntimeStatusRoute, + type OcrExtractArtifactInput, + type OcrExtractionOutput, + type OcrExtractUploadInput +} from '@shared/contracts/routes' +import { + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION +} from '@shared/contracts/localControl' +import { + DocumentTextExtractionError, + type DocumentTextExtractionResult +} from '@/ocr/documentTextExtractionService' +import { + ImageTextExtractionError, + type ImageTextExtractionResult +} from '@/ocr/imageTextExtractionService' +import { ImagePreprocessingError, sniffOcrImageMimeType } from '@/ocr/imagePreprocessor' +import { + OcrRuntimeBusyError, + type OcrRuntimeService, + type OcrRuntimeServiceStatus +} from '@/ocr/ocrRuntimeService' +import { toPublicOcrEngine, toPublicOcrStatus } from '@/ocr/routes' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import type { ArtifactSpool } from './artifactSpool' +import { CliRequestError } from './errors' +import type { CliUploadedInputFile } from './server' + +const OCR_SIGNATURE_BYTES = 1_024 + +type CliOcrRuntime = Pick< + OcrRuntimeService, + 'clearCache' | 'extract' | 'extractDocument' | 'getStatus' +> + +export type CliOcrServiceOptions = Readonly<{ + appVersion: string + ocrRuntime: CliOcrRuntime + artifactSpool: ArtifactSpool + now?: () => number + log?: Pick +}> + +export class CliOcrService { + private readonly now: () => number + private readonly log: Pick + + constructor(private readonly options: CliOcrServiceOptions) { + this.now = options.now ?? Date.now + this.log = options.log ?? console + } + + handlesRpc(method: string): boolean { + return ( + method === ocrGetRuntimeStatusRoute.name || + method === ocrExtractArtifactRoute.name || + method === ocrClearCacheRoute.name + ) + } + + handlesUpload(method: string): boolean { + return method === ocrExtractUploadRoute.name + } + + async dispatchRpc( + method: string, + rawInput: unknown, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise { + switch (method) { + case ocrExtractArtifactRoute.name: + return await this.extractArtifact( + ocrExtractArtifactRoute.input.parse(rawInput), + caller, + signal + ) + case ocrGetRuntimeStatusRoute.name: + ocrGetRuntimeStatusRoute.input.parse(rawInput) + signal.throwIfAborted() + return ocrGetRuntimeStatusRoute.output.parse( + toPublicOcrStatus( + await this.options.ocrRuntime.getStatus(), + process.platform, + process.arch + ) + ) + case ocrClearCacheRoute.name: { + ocrClearCacheRoute.input.parse(rawInput) + if (caller.principal !== 'human') { + throw new CliRequestError('permission_denied', 'Agent callers cannot clear OCR cache', { + httpStatus: 403 + }) + } + signal.throwIfAborted() + try { + await this.options.ocrRuntime.clearCache() + } catch (error) { + if (error instanceof OcrRuntimeBusyError) { + throw new CliRequestError('conflict', error.message, { httpStatus: 409 }) + } + this.log.warn('[CLI] OCR cache clear failed', { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + throw new CliRequestError('unavailable', 'OCR cache could not be cleared', { + httpStatus: 503, + retriable: true + }) + } + const status = await this.options.ocrRuntime.getStatus() + if (!status.cache) { + throw new CliRequestError('internal_error', 'OCR cache status is unavailable', { + httpStatus: 500 + }) + } + return ocrClearCacheRoute.output.parse({ cache: status.cache }) + } + default: + throw new CliRequestError('not_found', 'OCR method is not implemented', { + httpStatus: 404 + }) + } + } + + async dispatchUpload( + method: string, + rawInput: unknown, + upload: CliUploadedInputFile, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise { + if (caller.principal !== 'human') { + throw new CliRequestError('permission_denied', 'Agent callers cannot upload file bytes', { + httpStatus: 403 + }) + } + switch (method) { + case ocrExtractUploadRoute.name: + return await this.extractUpload(ocrExtractUploadRoute.input.parse(rawInput), upload, signal) + default: + throw new CliRequestError('not_found', 'Upload method is not implemented', { + httpStatus: 404 + }) + } + } + + private async extractArtifact( + input: OcrExtractArtifactInput, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise { + return await this.options.artifactSpool.withFile(input.artifactId, caller, async (file) => { + const mimeType = OcrInputMimeTypeSchema.safeParse(file.metadata.mimeType) + if (!mimeType.success) { + throw new CliRequestError('invalid_request', 'Artifact is not a supported OCR input') + } + this.assertInputSize(file.metadata.size, 'OCR artifact') + return await this.extractFile(input, file.path, file.metadata.size, mimeType.data, signal) + }) + } + + private async extractUpload( + input: OcrExtractUploadInput, + upload: CliUploadedInputFile, + signal: AbortSignal + ): Promise { + this.assertInputSize(upload.size, 'OCR upload') + return await this.extractFile(input, upload.path, upload.size, input.mimeType, signal) + } + + private async extractFile( + input: Pick, + filePath: string, + inputBytes: number, + declaredMimeType: string, + signal: AbortSignal + ): Promise { + const startedAt = this.now() + try { + signal.throwIfAborted() + const statusBefore = await this.options.ocrRuntime.getStatus() + if (statusBefore.availability.status === 'unavailable') { + throw new CliRequestError('unavailable', 'OCR runtime is unavailable', { + httpStatus: 503, + details: { reason: statusBefore.availability.reason } + }) + } + const kind = await this.inspectOcrInput(filePath, inputBytes, declaredMimeType) + signal.throwIfAborted() + if (kind === 'image') { + if (input.sourcePageCountHint !== undefined || input.generationTokenLimit !== undefined) { + throw new CliRequestError( + 'invalid_request', + 'PDF-specific OCR options cannot be used with an image' + ) + } + const result = await this.options.ocrRuntime.extract({ + filePath, + maxFileSize: inputBytes, + backend: input.backend, + priority: 'background', + signal + }) + return this.toImageOutput(result, statusBefore, inputBytes, startedAt) + } + + const result = await this.options.ocrRuntime.extractDocument({ + filePath, + maxFileSize: inputBytes, + backend: input.backend, + ...(input.sourcePageCountHint !== undefined + ? { sourcePageCountHint: input.sourcePageCountHint } + : {}), + ...(input.generationTokenLimit !== undefined + ? { generationTokenLimit: input.generationTokenLimit } + : {}), + priority: 'background', + signal + }) + return this.toDocumentOutput(result, statusBefore, inputBytes, startedAt) + } catch (error) { + throw this.normalizeOcrError(error, signal) + } + } + + private async inspectOcrInput( + filePath: string, + inputBytes: number, + declaredMimeType: string + ): Promise<'image' | 'document'> { + const handle = await open(filePath, 'r') + try { + const fileStat = await handle.stat() + if (!fileStat.isFile() || fileStat.size !== inputBytes) { + throw new CliRequestError('unavailable', 'OCR input changed before extraction', { + httpStatus: 410 + }) + } + const prefix = Buffer.allocUnsafe(Math.min(OCR_SIGNATURE_BYTES, inputBytes)) + const { bytesRead } = await handle.read(prefix, 0, prefix.byteLength, 0) + const signature = prefix.subarray(0, bytesRead) + if (declaredMimeType === 'application/pdf') { + if (signature.indexOf('%PDF-') < 0) { + throw new CliRequestError('invalid_request', 'OCR input is not a valid PDF file') + } + return 'document' + } + + const detected = sniffOcrImageMimeType(signature) + if (detected !== declaredMimeType) { + throw new CliRequestError( + 'invalid_request', + 'OCR image signature does not match its declared MIME type' + ) + } + return 'image' + } finally { + await handle.close() + } + } + + private toImageOutput( + result: ImageTextExtractionResult, + statusBefore: OcrRuntimeServiceStatus, + inputBytes: number, + startedAt: number + ): OcrExtractionOutput { + return OcrExtractionOutputSchema.parse({ + kind: 'image', + text: result.text, + tokenCount: result.tokenCount, + truncated: result.truncated, + mimeType: result.mimeType, + imageWidth: result.imageWidth, + imageHeight: result.imageHeight, + strategy: result.strategy, + engine: toPublicOcrEngine(result.engine), + cacheHit: result.cacheHit, + timingMs: result.timingMs, + benchmark: this.createOcrBenchmark(result.cacheHit, statusBefore, inputBytes, startedAt) + }) + } + + private toDocumentOutput( + result: DocumentTextExtractionResult, + statusBefore: OcrRuntimeServiceStatus, + inputBytes: number, + startedAt: number + ): OcrExtractionOutput { + return OcrExtractionOutputSchema.parse({ + kind: 'document', + text: result.text, + tokenCount: result.tokenCount, + truncated: + result.generationOutputLimitReached || result.artifactTermination !== 'request_complete', + mimeType: 'application/pdf', + pageSpans: result.pageSpans, + artifactTermination: result.artifactTermination, + generationOutputLimitReached: result.generationOutputLimitReached, + generationTokenLimit: result.generationTokenLimit, + emittedPages: result.emittedPages, + ...(result.sourcePageCountHint !== undefined + ? { sourcePageCountHint: result.sourcePageCountHint } + : {}), + ...(result.resourceLimit + ? { + resourceLimit: { + code: result.resourceLimit.code, + message: 'OCR document processing reached a resource limit' + } + } + : {}), + engine: toPublicOcrEngine(result.engine), + cacheHit: result.cacheHit, + timingMs: result.timingMs, + benchmark: this.createOcrBenchmark(result.cacheHit, statusBefore, inputBytes, startedAt) + }) + } + + private createOcrBenchmark( + cacheHit: boolean, + statusBefore: OcrRuntimeServiceStatus, + inputBytes: number, + startedAt: number + ) { + const stateBefore = statusBefore.process?.state + return { + state: cacheHit + ? ('hit' as const) + : stateBefore === 'ready' || stateBefore === 'busy' + ? ('miss-warm' as const) + : ('cold-runtime' as const), + runtimeStateBefore: stateBefore ?? ('not-started' as const), + runtimeWasReady: stateBefore === 'ready', + inputBytes, + durationMs: Math.max(0, this.now() - startedAt), + appVersion: this.options.appVersion, + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + } + } + + private assertInputSize(size: number, name: string): void { + if (!Number.isSafeInteger(size) || size <= 0) { + throw new CliRequestError('invalid_request', `${name} is empty or invalid`) + } + if (size > OCR_EXTRACTION_MAX_INPUT_BYTES) { + throw new CliRequestError('body_too_large', `${name} exceeds its byte limit`, { + httpStatus: 413 + }) + } + } + + private normalizeOcrError(error: unknown, signal: AbortSignal): CliRequestError { + if (error instanceof CliRequestError) return error + if ( + signal.aborted || + (error instanceof ImagePreprocessingError && error.code === 'cancelled') || + (error instanceof ImageTextExtractionError && error.code === 'cancelled') || + (error instanceof DocumentTextExtractionError && error.code === 'cancelled') + ) { + return new CliRequestError('cancelled', 'OCR extraction was cancelled', { retriable: true }) + } + if ( + (error instanceof ImageTextExtractionError && error.code === 'queue_full') || + (error instanceof DocumentTextExtractionError && error.code === 'queue_full') + ) { + return new CliRequestError('rate_limited', 'OCR extraction capacity is full', { + httpStatus: 429, + retriable: true + }) + } + if ( + error instanceof ImagePreprocessingError || + (error instanceof DocumentTextExtractionError && + ['empty_input', 'input_too_large', 'invalid_input'].includes(error.code)) + ) { + return new CliRequestError('invalid_request', 'OCR input is invalid or unsupported') + } + this.log.warn('[CLI] OCR extraction failed', { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + return new CliRequestError('unavailable', 'OCR extraction failed', { + httpStatus: 503, + retriable: true + }) + } +} diff --git a/src/main/cli/policy.ts b/src/main/cli/policy.ts new file mode 100644 index 0000000000..628fd7a00c --- /dev/null +++ b/src/main/cli/policy.ts @@ -0,0 +1,304 @@ +import type { JsonValue } from '@shared/contracts/json' +import type { LocalControlEffect } from '@shared/contracts/localControl' +import { hashApprovalArguments } from '@/approval' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import { CliRequestError } from './errors' +import type { CliMutationGuard } from './mutationGuard' +import { resolveCliSurfaceEffect, type CliSurfaceEntry } from './surface' + +const DEFAULT_AGENT_COMPUTE_LIMIT = 2 +const DEFAULT_AGENT_COMPUTE_STARTS_PER_MINUTE = 20 +const COMPUTE_WINDOW_MS = 60_000 + +export type CliPolicyAuditOutcome = + | 'allowed' + | 'denied' + | 'approved' + | 'approval-denied' + | 'approval-timeout' + | 'cancelled' + | 'unavailable' + | 'rate-limited' + | 'misconfigured' + +export type CliPolicyAuditRecord = Readonly<{ + timestamp: number + principal: CliRouteCaller['principal'] + connectionId: string + conversationId?: string + operation: string + effect: LocalControlEffect + outcome: CliPolicyAuditOutcome + requestId: string + approvalRequestId?: string + redactedArgumentsHash: string +}> + +export type CliRequestPolicyInput = Readonly<{ + entry: CliSurfaceEntry + input: unknown + transportBinding?: JsonValue + caller: CliRouteCaller + requestId: string + signal: AbortSignal +}> + +export type CliRequestAdmission = Readonly<{ + release(): void +}> + +export type CliRequestPolicyOptions = Readonly<{ + mutationGuard: CliMutationGuard + audit(record: CliPolicyAuditRecord): void | Promise + agentComputeLimit?: number + agentComputeStartsPerMinute?: number + now?: () => number +}> + +type EffectDecision = 'allow' | 'deny' | 'approval' + +function resolveEffectDecision( + effect: LocalControlEffect, + caller: CliRouteCaller, + agentPolicy: CliSurfaceEntry['agentPolicy'] +): EffectDecision { + if (caller.principal === 'human') { + return effect === 'read' || + effect === 'compute' || + effect === 'local-maintenance' || + effect === 'preference-write' + ? 'allow' + : 'approval' + } + + if (effect === 'read' || effect === 'compute') return 'allow' + if (effect === 'local-maintenance' && agentPolicy === 'allow') return 'allow' + if ( + (effect === 'preference-write' || effect === 'security-config' || effect === 'supply-chain') && + agentPolicy === 'approval' + ) { + return 'approval' + } + return 'deny' +} + +function positiveInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value <= 0) throw new Error(`${name} must be positive`) + return value +} + +function emptyRelease(): CliRequestAdmission { + return { release: () => undefined } +} + +function auditProjection(entry: CliSurfaceEntry, input: unknown): JsonValue { + return entry.auditProjection?.(input) ?? {} +} + +export class CliRequestPolicy { + private readonly now: () => number + private readonly agentComputeLimit: number + private readonly agentComputeStartsPerMinute: number + private readonly activeAgentCompute = new Map() + private readonly agentComputeStarts = new Map() + private lastComputePruneAt = 0 + + constructor(private readonly options: CliRequestPolicyOptions) { + this.now = options.now ?? Date.now + this.agentComputeLimit = positiveInteger( + options.agentComputeLimit ?? DEFAULT_AGENT_COMPUTE_LIMIT, + 'agentComputeLimit' + ) + this.agentComputeStartsPerMinute = positiveInteger( + options.agentComputeStartsPerMinute ?? DEFAULT_AGENT_COMPUTE_STARTS_PER_MINUTE, + 'agentComputeStartsPerMinute' + ) + } + + async authorize(input: CliRequestPolicyInput): Promise { + let effect: LocalControlEffect + let agentInputAllowed = true + try { + effect = resolveCliSurfaceEffect(input.entry, input.input) + if (input.caller.principal === 'agent') { + agentInputAllowed = input.entry.agentInputAllowed?.(input.input) ?? true + } + } catch { + throw new CliRequestError('internal_error', 'CLI effect policy is misconfigured', { + httpStatus: 500 + }) + } + const redactedArguments = + input.transportBinding !== undefined + ? { + request: auditProjection(input.entry, input.input), + transport: input.transportBinding + } + : auditProjection(input.entry, input.input) + const approvalArguments = + input.transportBinding !== undefined + ? { params: input.input, transport: input.transportBinding } + : input.input + const redactedArgumentsHash = hashApprovalArguments({ + operation: input.entry.contract.name, + arguments: redactedArguments + }) + const audit = async ( + outcome: CliPolicyAuditOutcome, + approvalRequestId?: string + ): Promise => { + await this.options.audit({ + timestamp: this.now(), + principal: input.caller.principal, + connectionId: input.caller.connectionId, + ...(input.caller.principal === 'agent' + ? { conversationId: input.caller.conversationId } + : {}), + operation: input.entry.contract.name, + effect, + outcome, + requestId: input.requestId, + ...(approvalRequestId ? { approvalRequestId } : {}), + redactedArgumentsHash + }) + } + + if ( + !input.entry.callers.includes(input.caller.principal) || + !input.entry.scopes.every((scope) => input.caller.scopes.includes(scope)) || + !agentInputAllowed + ) { + await audit('denied') + throw new CliRequestError('permission_denied', 'Caller lacks access to this operation', { + httpStatus: 403 + }) + } + + const effectDecision = resolveEffectDecision(effect, input.caller, input.entry.agentPolicy) + if (effectDecision === 'deny') { + await audit('denied') + throw new CliRequestError('permission_denied', 'Operation is denied for this caller', { + httpStatus: 403 + }) + } + + if (effectDecision === 'approval') { + if (input.entry.approval !== 'policy' || !input.entry.approvalDisplay) { + await audit('misconfigured') + throw new CliRequestError('internal_error', 'CLI approval policy is misconfigured', { + httpStatus: 500 + }) + } + let approvalRequestId: string + try { + const routeDisplayData = input.entry.approvalDisplay(input.input, input.caller) + const approvalDisplayData = + input.transportBinding !== undefined + ? { request: routeDisplayData, transport: input.transportBinding } + : routeDisplayData + const approval = await this.options.mutationGuard.authorize({ + operation: input.entry.contract.name, + effect, + principal: input.caller.principal, + connectionId: input.caller.connectionId, + clientRequestId: input.requestId, + arguments: approvalArguments, + displayData: approvalDisplayData, + signal: input.signal + }) + approvalRequestId = approval.approvalRequestId + } catch (error) { + await audit(this.toApprovalAuditOutcome(error)) + throw error + } + await audit('approved', approvalRequestId) + } + + let admission: CliRequestAdmission + try { + admission = this.admitCompute(input, effect) + } catch (error) { + if (error instanceof CliRequestError && error.code === 'rate_limited') { + await audit('rate-limited') + } + throw error + } + try { + if (effectDecision === 'allow') await audit('allowed') + return admission + } catch (error) { + admission.release() + throw error + } + } + + private admitCompute( + input: CliRequestPolicyInput, + effect: LocalControlEffect + ): CliRequestAdmission { + if (effect !== 'compute' || input.caller.principal !== 'agent') { + return emptyRelease() + } + + const owner = input.caller.conversationId + const active = this.activeAgentCompute.get(owner) ?? 0 + const now = this.now() + this.pruneComputeStarts(now) + const recentStarts = (this.agentComputeStarts.get(owner) ?? []).filter( + (timestamp) => timestamp > now - COMPUTE_WINDOW_MS + ) + if ( + active >= this.agentComputeLimit || + recentStarts.length >= this.agentComputeStartsPerMinute + ) { + if (recentStarts.length > 0) this.agentComputeStarts.set(owner, recentStarts) + else this.agentComputeStarts.delete(owner) + throw new CliRequestError('rate_limited', 'Agent compute capacity is full', { + httpStatus: 429, + retriable: true + }) + } + + recentStarts.push(now) + this.agentComputeStarts.set(owner, recentStarts) + this.activeAgentCompute.set(owner, active + 1) + let released = false + return { + release: () => { + if (released) return + released = true + const remaining = Math.max(0, (this.activeAgentCompute.get(owner) ?? 1) - 1) + if (remaining > 0) this.activeAgentCompute.set(owner, remaining) + else this.activeAgentCompute.delete(owner) + } + } + } + + private pruneComputeStarts(now: number): void { + if (now - this.lastComputePruneAt < COMPUTE_WINDOW_MS) return + this.lastComputePruneAt = now + for (const [owner, starts] of this.agentComputeStarts) { + if ((this.activeAgentCompute.get(owner) ?? 0) > 0) continue + const recent = starts.filter((timestamp) => timestamp > now - COMPUTE_WINDOW_MS) + if (recent.length > 0) this.agentComputeStarts.set(owner, recent) + else this.agentComputeStarts.delete(owner) + } + } + + private toApprovalAuditOutcome(error: unknown): CliPolicyAuditOutcome { + if (!(error instanceof CliRequestError)) return 'unavailable' + switch (error.code) { + case 'approval_denied': + return 'approval-denied' + case 'approval_timeout': + return 'approval-timeout' + case 'cancelled': + case 'timeout': + return 'cancelled' + case 'rate_limited': + return 'rate-limited' + default: + return 'unavailable' + } + } +} diff --git a/src/main/cli/providerModelAdminRoutes.ts b/src/main/cli/providerModelAdminRoutes.ts new file mode 100644 index 0000000000..853ace6d7b --- /dev/null +++ b/src/main/cli/providerModelAdminRoutes.ts @@ -0,0 +1,287 @@ +import { randomUUID } from 'node:crypto' +import { + PublicModelConfigSchema, + PublicProviderSummarySchema, + modelsGetPublicConfigRoute, + modelsSetPublicConfigRoute, + providersAddPublicRoute, + providersSetCredentialRoute, + providersTestPublicConnectionRoute, + providersUpdatePublicRoute, + type PublicProviderSummary, + type SettingsActivityInput +} from '@shared/contracts/routes' +import type { LLM_PROVIDER } from '@shared/types/provider' +import type { ProviderRuntime } from '@/provider' +import type { ProviderQueryScheduler } from '@/provider/providerService' +import type { ProviderSettingsPort } from '@/provider/settings' +import { createRouteMap, type DeepchatRouteMap, type RouteCaller } from '@/routes/routeRegistry' +import { CliRequestError } from './errors' + +type PublicProviderSettings = Pick< + ProviderSettingsPort, + 'getProviderById' | 'getModelConfig' | 'isKnownModel' | 'setModelConfig' +> +type PublicProviderRuntime = Pick< + ProviderRuntime, + 'addProviderAtomic' | 'check' | 'updateProviderAtomic' +> + +const PUBLIC_PROVIDER_TEST_TIMEOUT_MS = 5_000 + +type ExtendedProviderCredentialState = LLM_PROVIDER & { + credential?: { accessKeyId?: string; secretAccessKey?: string; profile?: string } + accountPrivateKey?: string +} + +export type CliProviderModelAdminDependencies = Readonly<{ + providerSettings: PublicProviderSettings + providerRuntime: PublicProviderRuntime + scheduler: ProviderQueryScheduler + recordSettingsActivity?(input: SettingsActivityInput): void + createProviderId?: () => string + log?: Pick +}> + +function requireCliCaller(caller: RouteCaller): void { + if (caller.kind !== 'cli') { + throw new CliRequestError('permission_denied', 'Public provider routes require a CLI caller', { + httpStatus: 403 + }) + } +} + +function hasStoredCredential(provider: LLM_PROVIDER): boolean { + const candidate = provider as ExtendedProviderCredentialState + return Boolean( + provider.apiKey?.trim() || + provider.oauthToken?.trim() || + candidate.credential?.accessKeyId?.trim() || + candidate.credential?.secretAccessKey?.trim() || + candidate.credential?.profile?.trim() || + candidate.accountPrivateKey?.trim() + ) +} + +export function toPublicProviderSummary(provider: LLM_PROVIDER): PublicProviderSummary { + return PublicProviderSummarySchema.parse({ + id: provider.id, + name: provider.name || provider.id, + apiType: provider.apiType, + enabled: provider.enable, + custom: provider.custom === true, + storedCredentialConfigured: hasStoredCredential(provider) + }) +} + +export function createCliProviderModelAdminRoutes( + dependencies: CliProviderModelAdminDependencies +): DeepchatRouteMap { + const createProviderId = dependencies.createProviderId ?? randomUUID + const log = dependencies.log ?? console + const executeMutation = async ( + action: string, + operation: () => T | Promise + ): Promise => { + try { + return await operation() + } catch (error) { + log.warn(`[CLI] Failed to ${action}`, { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + throw new CliRequestError('unavailable', `Could not ${action}`, { + httpStatus: 503, + retriable: true + }) + } + } + const requireProvider = (providerId: string): LLM_PROVIDER => { + const provider = dependencies.providerSettings.getProviderById(providerId) + if (!provider) { + throw new CliRequestError('not_found', 'Provider was not found', { httpStatus: 404 }) + } + return provider + } + const requireModel = (providerId: string, modelId: string): void => { + requireProvider(providerId) + if (!dependencies.providerSettings.isKnownModel(providerId, modelId)) { + throw new CliRequestError('not_found', 'Model was not found', { httpStatus: 404 }) + } + } + const recordActivity = (input: SettingsActivityInput): void => { + dependencies.recordSettingsActivity?.(input) + } + + return createRouteMap([ + [ + providersTestPublicConnectionRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = providersTestPublicConnectionRoute.input.parse(rawInput) + requireProvider(input.providerId) + let isOk = false + try { + const result = await dependencies.scheduler.timeout({ + task: dependencies.providerRuntime.check(input.providerId, input.modelId), + ms: PUBLIC_PROVIDER_TEST_TIMEOUT_MS, + reason: `providers.testPublicConnection:${input.providerId}` + }) + isOk = result.isOk + } catch { + isOk = false + } + return providersTestPublicConnectionRoute.output.parse({ + isOk, + errorMsg: isOk ? null : 'Provider connection failed' + }) + } + ], + [ + providersAddPublicRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = providersAddPublicRoute.input.parse(rawInput) + const providerId = createProviderId() + if (dependencies.providerSettings.getProviderById(providerId)) { + throw new CliRequestError('conflict', 'Generated provider ID is already in use', { + httpStatus: 409 + }) + } + const provider: LLM_PROVIDER = { + id: providerId, + name: input.name, + apiType: input.apiType, + apiKey: '', + baseUrl: input.baseUrl, + enable: input.enabled, + custom: true + } + await executeMutation('add provider', () => + dependencies.providerRuntime.addProviderAtomic(provider) + ) + const stored = requireProvider(providerId) + recordActivity({ + category: 'provider', + action: 'created', + targetType: 'provider', + targetId: providerId, + targetLabel: stored.name, + routeName: 'settings-provider', + routeParams: { providerId }, + summaryKey: 'settings.controlCenter.activity.providerCreated', + summaryParams: { name: stored.name } + }) + return providersAddPublicRoute.output.parse({ + provider: toPublicProviderSummary(stored) + }) + } + ], + [ + providersUpdatePublicRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = providersUpdatePublicRoute.input.parse(rawInput) + const current = requireProvider(input.providerId) + if (input.updates.apiType !== undefined && current.custom !== true) { + throw new CliRequestError('conflict', 'Built-in provider API type cannot be changed', { + httpStatus: 409 + }) + } + const updates: Partial = { + ...(input.updates.name !== undefined ? { name: input.updates.name } : {}), + ...(input.updates.apiType !== undefined ? { apiType: input.updates.apiType } : {}), + ...(input.updates.baseUrl !== undefined ? { baseUrl: input.updates.baseUrl } : {}), + ...(input.updates.enabled !== undefined ? { enable: input.updates.enabled } : {}) + } + const requiresRebuild = await executeMutation('update provider', () => + dependencies.providerRuntime.updateProviderAtomic(input.providerId, updates) + ) + const stored = requireProvider(input.providerId) + const action = + input.updates.enabled === undefined + ? 'updated' + : input.updates.enabled + ? 'enabled' + : 'disabled' + recordActivity({ + category: 'provider', + action, + targetType: 'provider', + targetId: input.providerId, + targetLabel: stored.name, + routeName: 'settings-provider', + routeParams: { providerId: input.providerId }, + summaryKey: 'settings.controlCenter.activity.providerUpdated', + summaryParams: { name: stored.name } + }) + return providersUpdatePublicRoute.output.parse({ + provider: toPublicProviderSummary(stored), + requiresRebuild + }) + } + ], + [ + providersSetCredentialRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = providersSetCredentialRoute.input.parse(rawInput) + const current = requireProvider(input.providerId) + await executeMutation('update provider credential', () => + dependencies.providerRuntime.updateProviderAtomic(input.providerId, { + apiKey: input.action === 'set' ? input.value : '' + }) + ) + const stored = requireProvider(input.providerId) + recordActivity({ + category: 'provider', + action: 'updated', + targetType: 'provider', + targetId: input.providerId, + targetLabel: current.name, + routeName: 'settings-provider', + routeParams: { providerId: input.providerId }, + summaryKey: 'settings.controlCenter.activity.providerUpdated', + summaryParams: { name: current.name } + }) + return providersSetCredentialRoute.output.parse({ + providerId: input.providerId, + action: input.action, + kind: input.kind, + storedApiKeyConfigured: Boolean(stored.apiKey?.trim()) + }) + } + ], + [ + modelsGetPublicConfigRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = modelsGetPublicConfigRoute.input.parse(rawInput) + requireModel(input.providerId, input.modelId) + return modelsGetPublicConfigRoute.output.parse({ + config: PublicModelConfigSchema.parse( + dependencies.providerSettings.getModelConfig(input.modelId, input.providerId) + ) + }) + } + ], + [ + modelsSetPublicConfigRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = modelsSetPublicConfigRoute.input.parse(rawInput) + requireModel(input.providerId, input.modelId) + await executeMutation('update model configuration', () => + dependencies.providerSettings.setModelConfig( + input.modelId, + input.providerId, + input.config + ) + ) + const config = PublicModelConfigSchema.parse( + dependencies.providerSettings.getModelConfig(input.modelId, input.providerId) + ) + return modelsSetPublicConfigRoute.output.parse({ config }) + } + ] + ]) +} diff --git a/src/main/cli/publicText.ts b/src/main/cli/publicText.ts new file mode 100644 index 0000000000..067b15b7ef --- /dev/null +++ b/src/main/cli/publicText.ts @@ -0,0 +1,109 @@ +const PUBLIC_TEXT_SCAN_FACTOR = 16 +const PUBLIC_LIST_SCAN_FACTOR = 16 + +export type SanitizedPublicText = Readonly<{ value: string; truncated: boolean }> +export type SanitizedPublicList = Readonly<{ values: string[]; truncated: boolean }> + +export function compareStableText(left: string, right: string): number { + return left < right ? -1 : left > right ? 1 : 0 +} + +function isPublicTextControl(codePoint: number): boolean { + return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f) +} + +function isDirectionalControl(codePoint: number): boolean { + return ( + codePoint === 0x061c || + codePoint === 0x200e || + codePoint === 0x200f || + (codePoint >= 0x202a && codePoint <= 0x202e) || + (codePoint >= 0x2066 && codePoint <= 0x2069) + ) +} + +export function stripC0AndC1Controls(value: string, maxCodeUnits: number): string { + if (!Number.isSafeInteger(maxCodeUnits) || maxCodeUnits < 0) { + throw new RangeError('Public text scan limit must be a non-negative safe integer') + } + if (value.length > maxCodeUnits) { + throw new RangeError('Public text exceeds its scan limit') + } + + const output: string[] = [] + for (const character of value) { + if (!isPublicTextControl(character.codePointAt(0)!)) output.push(character) + } + return output.join('') +} + +export function sanitizePublicText(value: unknown, maxBytes: number): SanitizedPublicText { + if (typeof value !== 'string') return { value: '', truncated: false } + const output: string[] = [] + let bytes = 0 + let consumedCodeUnits = 0 + let pendingSpace = false + let truncated = false + const maxScannedCodeUnits = maxBytes * PUBLIC_TEXT_SCAN_FACTOR + + for (const character of value) { + consumedCodeUnits += character.length + if (consumedCodeUnits > maxScannedCodeUnits) { + truncated = true + break + } + const codePoint = character.codePointAt(0)! + if (isDirectionalControl(codePoint)) continue + if (isPublicTextControl(codePoint) || character.trim() === '') { + pendingSpace = output.length > 0 + continue + } + + if (pendingSpace) { + if (bytes + 1 > maxBytes) { + truncated = true + break + } + output.push(' ') + bytes += 1 + pendingSpace = false + } + const characterBytes = Buffer.byteLength(character, 'utf8') + if (bytes + characterBytes > maxBytes) { + truncated = true + break + } + output.push(character) + bytes += characterBytes + } + return { + value: output.join(''), + truncated: truncated || consumedCodeUnits < value.length + } +} + +export function sanitizePublicStringList( + value: unknown, + maxItems: number, + maxBytes: number +): SanitizedPublicList { + if (!Array.isArray(value)) return { values: [], truncated: false } + let itemTruncated = false + const maxScannedItems = maxItems * PUBLIC_LIST_SCAN_FACTOR + const scannedValues = value.slice(0, maxScannedItems) + const values = Array.from( + new Set( + scannedValues + .map((entry) => { + const sanitized = sanitizePublicText(entry, maxBytes) + itemTruncated ||= sanitized.truncated + return sanitized.value + }) + .filter((entry) => entry.length > 0) + ) + ).sort(compareStableText) + return { + values: values.slice(0, maxItems), + truncated: itemTruncated || value.length > scannedValues.length || values.length > maxItems + } +} diff --git a/src/main/cli/routes.ts b/src/main/cli/routes.ts new file mode 100644 index 0000000000..791a93f591 --- /dev/null +++ b/src/main/cli/routes.ts @@ -0,0 +1,103 @@ +import { + cliCapabilitiesRoute, + cliDoctorRoute, + cliStatusRoute, + cliVersionRoute +} from '@shared/contracts/routes' +import { + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION +} from '@shared/contracts/localControl' +import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' +import { listCliSurfaceCapabilities } from './surface' + +export type CliRuntimeStatus = Readonly<{ + running: boolean + pid: number + startedAt: number + uptimeMs: number + endpointKind: 'unix' | 'pipe' + activeConnections: number + pendingRequests: number + descriptorReady: boolean +}> + +export function createCliRoutes(deps: { + appVersion: string + getStatus(): CliRuntimeStatus + hasTrustedRenderer(): boolean | Promise +}): DeepchatRouteMap { + return createRouteMap([ + [ + cliStatusRoute.name, + async (rawInput) => { + cliStatusRoute.input.parse(rawInput) + const { descriptorReady: _descriptorReady, ...status } = deps.getStatus() + return cliStatusRoute.output.parse(status) + } + ], + [ + cliVersionRoute.name, + async (rawInput) => { + cliVersionRoute.input.parse(rawInput) + return cliVersionRoute.output.parse({ + appVersion: deps.appVersion, + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + }) + } + ], + [ + cliCapabilitiesRoute.name, + async (rawInput) => { + cliCapabilitiesRoute.input.parse(rawInput) + return cliCapabilitiesRoute.output.parse({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + capabilities: listCliSurfaceCapabilities() + }) + } + ], + [ + cliDoctorRoute.name, + async (rawInput) => { + cliDoctorRoute.input.parse(rawInput) + const status = deps.getStatus() + const capabilities = listCliSurfaceCapabilities() + const hasTrustedRenderer = await deps.hasTrustedRenderer() + const checks = [ + { + id: 'transport' as const, + status: status.running ? ('ok' as const) : ('error' as const), + message: status.running + ? 'Local transport is accepting requests' + : 'Local transport is stopped' + }, + { + id: 'descriptor' as const, + status: status.descriptorReady ? ('ok' as const) : ('error' as const), + message: status.descriptorReady + ? 'Private discovery descriptor is available' + : 'Private discovery descriptor is unavailable' + }, + { + id: 'surface' as const, + status: capabilities.length > 0 ? ('ok' as const) : ('error' as const), + message: `${capabilities.length} V1 methods are registered` + }, + { + id: 'renderer' as const, + status: hasTrustedRenderer ? ('ok' as const) : ('warning' as const), + message: hasTrustedRenderer + ? 'A trusted renderer can present approvals' + : 'No trusted renderer is currently available for approvals' + } + ] + return cliDoctorRoute.output.parse({ + healthy: checks.every((check) => check.status !== 'error'), + checks + }) + } + ] + ]) +} diff --git a/src/main/cli/runService.ts b/src/main/cli/runService.ts new file mode 100644 index 0000000000..f51d22947d --- /dev/null +++ b/src/main/cli/runService.ts @@ -0,0 +1,467 @@ +import type { + ChatMessagePageResult, + ChatMessageRecord, + CreateDetachedSessionInput, + MessagePageCursor, + MessageStartResult, + SessionRecord, + SessionWithState +} from '@shared/types/agent-interface' +import { + eventsSubscribeRoute, + RUN_MESSAGE_MAX_TEXT_BYTES, + runsCancelRoute, + runsGetRoute, + sessionsRunDetachedRoute, + type EventsSubscribeInput, + type PublicRunMessage, + type PublicRunSnapshot, + type RunDetachedInput, + type RunGetInput +} from '@shared/contracts/routes' +import { + runsCancelRequestedEvent, + runsCreatedEvent, + runsSnapshotEvent, + runsTurnAcceptedEvent, + runsTurnFailedEvent +} from '@shared/contracts/events' +import { extractUserMessageInput } from '@/session/data/userMessageContent' +import { buildAssistantResponseMarkdown } from '@/agent/deepchat/runtime/sessionUpdates' +import type { AssistantMessageBlock } from '@shared/types/agent-interface' +import { + createRouteMap, + type CliRouteCaller, + type DeepchatRouteMap, + type RouteCaller +} from '@/routes/routeRegistry' +import type { TypedEventHub } from '@/events/typedEventHub' +import { TypedEventHubCapacityError, TypedEventHubOverflowError } from '@/events/typedEventHub' +import { CliRequestError } from './errors' +import type { CliStreamEmitter } from './server' + +const DEFAULT_MESSAGE_LIMIT = 50 +const RUN_SNAPSHOT_MESSAGE_BUDGET_BYTES = 8 * 1024 * 1024 +const RUN_START_FAILURE_MESSAGE = 'Detached Agent run could not start' + +type RunLifecyclePort = Readonly<{ + createDetachedSession(input: CreateDetachedSessionInput): Promise +}> + +type RunTurnPort = Readonly<{ + sendMessage( + sessionId: string, + content: string, + options?: { maxProviderRounds?: number } + ): Promise + cancelGeneration(sessionId: string): Promise +}> + +type RunProjectionPort = Readonly<{ + getSession(sessionId: string): Promise + listMessagesPage( + sessionId: string, + options?: { limit?: number; cursor?: MessagePageCursor | null } + ): Promise +}> + +type RunSessionStorePort = Readonly<{ + get(sessionId: string): SessionRecord | null +}> + +export type CliRunServiceOptions = Readonly<{ + lifecycle: RunLifecyclePort + turn: RunTurnPort + projection: RunProjectionPort + sessions: RunSessionStorePort + eventHub: TypedEventHub + now?: () => number + log?: Pick +}> + +function requireCliCaller(caller: RouteCaller): CliRouteCaller { + if (caller.kind !== 'cli') { + throw new CliRequestError('permission_denied', 'Run routes require a CLI caller', { + httpStatus: 403 + }) + } + return caller +} + +function truncateUtf8(value: string, maxBytes: number): { value: string; truncated: boolean } { + if (Buffer.byteLength(value, 'utf8') <= maxBytes) return { value, truncated: false } + const output: string[] = [] + let bytes = 0 + for (const character of value) { + const characterBytes = Buffer.byteLength(character, 'utf8') + if (bytes + characterBytes > maxBytes) break + output.push(character) + bytes += characterBytes + } + return { value: output.join(''), truncated: true } +} + +function messageText(message: ChatMessageRecord): string { + if (message.role === 'user') return extractUserMessageInput(message.content).text + try { + const blocks = JSON.parse(message.content) as AssistantMessageBlock[] + return Array.isArray(blocks) ? buildAssistantResponseMarkdown(blocks) : message.content + } catch { + return message.content + } +} + +function toPublicMessage(message: ChatMessageRecord): PublicRunMessage { + const text = truncateUtf8(messageText(message), RUN_MESSAGE_MAX_TEXT_BYTES) + return { + id: message.id, + role: message.role, + status: message.status, + text: text.value, + textTruncated: text.truncated, + createdAt: message.createdAt, + updatedAt: message.updatedAt + } +} + +function projectMessagePage( + page: ChatMessagePageResult +): Pick { + const messages: PublicRunMessage[] = [] + let serializedBytes = 2 + let firstIncludedIndex = page.messages.length + + for (let index = page.messages.length - 1; index >= 0; index -= 1) { + const message = toPublicMessage(page.messages[index]) + const messageBytes = Buffer.byteLength(JSON.stringify(message), 'utf8') + const separatorBytes = messages.length > 0 ? 1 : 0 + if (serializedBytes + separatorBytes + messageBytes > RUN_SNAPSHOT_MESSAGE_BUDGET_BYTES) break + messages.unshift(message) + serializedBytes += separatorBytes + messageBytes + firstIncludedIndex = index + } + + const omittedFromPage = firstIncludedIndex > 0 + const hasMore = page.hasMore || omittedFromPage + const firstIncluded = page.messages[firstIncludedIndex] + const nextCursor = omittedFromPage + ? firstIncluded + ? { orderSeq: firstIncluded.orderSeq, id: firstIncluded.id } + : page.nextCursor + : page.nextCursor + + return { messages, nextCursor: hasMore ? nextCursor : null, hasMore } +} + +export class CliRunService { + private readonly now: () => number + private readonly log: Pick + + constructor(private readonly options: CliRunServiceOptions) { + this.now = options.now ?? Date.now + this.log = options.log ?? console + } + + createRoutes(): DeepchatRouteMap { + return createRouteMap([ + [ + sessionsRunDetachedRoute.name, + async (rawInput, context) => + await this.startDetachedRun( + sessionsRunDetachedRoute.input.parse(rawInput), + requireCliCaller(context.caller) + ) + ], + [ + runsGetRoute.name, + async (rawInput, context) => + await this.getRun(runsGetRoute.input.parse(rawInput), requireCliCaller(context.caller)) + ], + [ + runsCancelRoute.name, + async (rawInput, context) => + await this.cancelRun( + runsCancelRoute.input.parse(rawInput), + requireCliCaller(context.caller) + ) + ] + ]) + } + + handlesStream(method: string): boolean { + return method === eventsSubscribeRoute.name + } + + async dispatchStream( + method: string, + rawInput: unknown, + caller: CliRouteCaller, + signal: AbortSignal, + emit: CliStreamEmitter + ): Promise { + if (method !== eventsSubscribeRoute.name) { + throw new CliRequestError('not_found', 'Run streaming method is not implemented', { + httpStatus: 404 + }) + } + return await this.subscribeToRun( + eventsSubscribeRoute.input.parse(rawInput), + caller, + signal, + emit + ) + } + + private async startDetachedRun( + input: RunDetachedInput, + caller: CliRouteCaller + ): Promise { + if (caller.principal !== 'human') { + throw new CliRequestError('permission_denied', 'Agents cannot create detached Agent runs', { + httpStatus: 403 + }) + } + + const session = await this.options.lifecycle.createDetachedSession({ + ...(input.agentId ? { agentId: input.agentId } : {}), + title: input.title ?? 'CLI Run', + ...(input.projectDir ? { projectDir: input.projectDir } : {}), + ...(input.providerId ? { providerId: input.providerId } : {}), + ...(input.modelId ? { modelId: input.modelId } : {}), + permissionMode: 'default', + ...(input.activeSkills ? { activeSkills: input.activeSkills } : {}), + ...(input.disabledAgentTools ? { disabledAgentTools: input.disabledAgentTools } : {}), + ...(input.systemPrompt !== undefined + ? { generationSettings: { systemPrompt: input.systemPrompt } } + : {}), + metadata: { source: 'cli_run' } + }) + const runId = session.id + this.options.eventHub.publish( + runsCreatedEvent.name, + { + runId, + sessionId: session.id, + status: session.status, + createdAt: session.createdAt + }, + { kind: 'run', runId } + ) + + let initialTurn: MessageStartResult + try { + initialTurn = await this.options.turn.sendMessage( + session.id, + input.prompt, + input.maxTurns ? { maxProviderRounds: input.maxTurns } : undefined + ) + } catch (error) { + this.log.warn('[CLI] Failed to start detached Agent run', { + runId, + failure: { name: error instanceof Error ? error.name : typeof error } + }) + this.options.eventHub.publish( + runsTurnFailedEvent.name, + { + runId, + sessionId: session.id, + failedAt: this.now(), + error: RUN_START_FAILURE_MESSAGE + }, + { kind: 'run', runId } + ) + throw new CliRequestError('conflict', RUN_START_FAILURE_MESSAGE, { + httpStatus: 409, + details: { runId, sessionId: session.id } + }) + } + + const acceptedAt = this.now() + this.options.eventHub.publish( + runsTurnAcceptedEvent.name, + { + runId, + sessionId: session.id, + requestId: initialTurn.requestId, + messageId: initialTurn.messageId, + acceptedAt + }, + { kind: 'run', runId } + ) + const acceptedSession = await this.requireRunSnapshot(runId) + return sessionsRunDetachedRoute.output.parse({ + runId, + sessionId: session.id, + status: acceptedSession.status, + requestId: initialTurn.requestId, + messageId: initialTurn.messageId, + createdAt: session.createdAt + }) + } + + private async getRun(input: RunGetInput, caller: CliRouteCaller): Promise { + this.requireOwnedRun(input.runId, caller) + return await this.buildSnapshot(input.runId, input.limit, input.cursor) + } + + private async cancelRun(input: { runId: string }, caller: CliRouteCaller): Promise { + this.requireOwnedRun(input.runId, caller) + const before = await this.requireRunSnapshot(input.runId) + const cancelRequested = before.status === 'generating' + if (cancelRequested) { + await this.options.turn.cancelGeneration(input.runId) + this.options.eventHub.publish( + runsCancelRequestedEvent.name, + { + runId: input.runId, + sessionId: input.runId, + requestedAt: this.now() + }, + { kind: 'run', runId: input.runId } + ) + } + const after = cancelRequested ? await this.requireRunSnapshot(input.runId) : before + return runsCancelRoute.output.parse({ + runId: input.runId, + cancelRequested, + status: after.status + }) + } + + private async subscribeToRun( + input: EventsSubscribeInput, + caller: CliRouteCaller, + signal: AbortSignal, + emit: CliStreamEmitter + ): Promise { + const session = this.requireOwnedRun(input.runId, caller) + if (session.metadata?.source !== 'cli_run') { + throw new CliRequestError('not_found', 'Run was not found', { httpStatus: 404 }) + } + let subscription + try { + subscription = this.options.eventHub.subscribe( + { kind: 'run', runId: input.runId }, + { ...(input.cursor ? { afterCursor: input.cursor } : {}), signal } + ) + } catch (error) { + if (error instanceof TypedEventHubCapacityError) { + throw new CliRequestError('rate_limited', 'Too many active event subscribers', { + httpStatus: 429, + retriable: true + }) + } + throw error + } + + let lastCursor = subscription.initialCursor + try { + const currentRun = await this.buildSnapshot(input.runId, input.messageLimit) + const terminalAtSubscribe = currentRun.status !== 'generating' + if (subscription.recoveryReason) { + const snapshot = runsSnapshotEvent.payload.parse({ + cursor: subscription.initialCursor, + recoveryReason: subscription.recoveryReason, + run: currentRun + }) + await emit(runsSnapshotEvent.name, snapshot, { + runId: input.runId, + cursor: subscription.initialCursor + }) + if (terminalAtSubscribe) { + return eventsSubscribeRoute.output.parse({ runId: input.runId, lastCursor }) + } + } + + let caughtUp = + subscription.recoveryReason !== null || input.cursor === subscription.initialCursor + if (terminalAtSubscribe && caughtUp) { + return eventsSubscribeRoute.output.parse({ runId: input.runId, lastCursor }) + } + for await (const event of subscription.events) { + await emit(event.event, event.data, { + runId: input.runId, + cursor: event.cursor + }) + lastCursor = event.cursor + if (!caughtUp && event.cursor === subscription.initialCursor) { + caughtUp = true + if (terminalAtSubscribe) break + continue + } + if (caughtUp && this.isTerminalEvent(input.runId, event.event, event.data)) break + } + } catch (error) { + if (error instanceof TypedEventHubOverflowError) { + throw new CliRequestError('result_too_large', 'Event subscriber could not keep up', { + httpStatus: 409, + retriable: true, + details: { runId: input.runId, lastCursor } + }) + } + throw error + } finally { + subscription.close() + } + + return eventsSubscribeRoute.output.parse({ runId: input.runId, lastCursor }) + } + + private isTerminalEvent(runId: string, event: string, data: unknown): boolean { + if (!data || typeof data !== 'object' || Array.isArray(data)) return false + const payload = data as { runId?: unknown; sessionId?: unknown; status?: unknown } + if (event === runsTurnFailedEvent.name) return payload.runId === runId + if (payload.sessionId !== runId) return false + if (event === 'chat.stream.completed' || event === 'chat.stream.failed') return true + if (event !== 'sessions.status.changed') return false + const status = payload.status + return status === 'idle' || status === 'error' + } + + private requireOwnedRun(runId: string, caller: CliRouteCaller): SessionRecord { + const session = this.options.sessions.get(runId) + if (!session) { + throw new CliRequestError('not_found', 'Run was not found', { httpStatus: 404 }) + } + const owned = + caller.principal === 'human' + ? session.metadata?.source === 'cli_run' + : caller.conversationId === runId + if (!owned) { + throw new CliRequestError('not_found', 'Run was not found', { httpStatus: 404 }) + } + return session + } + + private async requireRunSnapshot(runId: string): Promise { + const session = await this.options.projection.getSession(runId) + if (!session) { + throw new CliRequestError('not_found', 'Run was not found', { httpStatus: 404 }) + } + return session + } + + private async buildSnapshot( + runId: string, + limit = DEFAULT_MESSAGE_LIMIT, + cursor?: MessagePageCursor | null + ): Promise { + const [session, page] = await Promise.all([ + this.requireRunSnapshot(runId), + this.options.projection.listMessagesPage(runId, { limit, cursor: cursor ?? null }) + ]) + const projectedPage = projectMessagePage(page) + return runsGetRoute.output.parse({ + runId, + sessionId: session.id, + agentId: session.agentId, + title: session.title, + status: session.status, + providerId: session.providerId, + modelId: session.modelId, + createdAt: session.createdAt, + updatedAt: session.updatedAt, + ...projectedPage + }) + } +} diff --git a/src/main/cli/server.ts b/src/main/cli/server.ts new file mode 100644 index 0000000000..475e9de78b --- /dev/null +++ b/src/main/cli/server.ts @@ -0,0 +1,1216 @@ +import { createHash, randomUUID, timingSafeEqual } from 'node:crypto' +import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http' +import type { Socket } from 'node:net' +import path from 'node:path' +import { pipeline } from 'node:stream/promises' +import { z } from 'zod' +import { ArtifactIdSchema, artifactsReadRoute } from '@shared/contracts/routes' +import { JsonValueSchema, TimestampMsSchema, type JsonValue } from '@shared/contracts/common' +import { + LOCAL_CONTROL_DESCRIPTOR_FILENAME, + LOCAL_CONTROL_ARTIFACT_PATH_PREFIX, + LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS, + LOCAL_CONTROL_METHOD_HEADER, + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_RPC_PATH, + LOCAL_CONTROL_SCOPES, + LOCAL_CONTROL_STREAM_PATH, + LOCAL_CONTROL_SURFACE_VERSION, + LOCAL_CONTROL_UPLOAD_PATH, + LOCAL_CONTROL_UPLOAD_REQUEST_HEADER, + LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES, + LOCAL_CONTROL_MAX_STREAM_RECORD_BYTES, + LOCAL_CONTROL_MAX_UPLOAD_REQUEST_HEADER_BYTES, + LocalControlEventEnvelopeSchema, + LocalControlMethodSchema, + LocalControlScopesSchema, + LocalControlTokenSchema, + LocalControlRpcRequestSchema, + LocalControlUploadRequestSchema, + createLocalControlFailure, + createLocalControlSuccess, + type LocalControlDescriptor, + type LocalControlRpcRequest, + type LocalControlUploadBinding, + type LocalControlStreamRecord +} from '@shared/contracts/localControl' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import type { CliRequestAdmission, CliRequestPolicyInput } from './policy' +import { + parseBoundedJsonBody, + parseBoundedJsonBytes, + readBoundedRequestBody, + readDeclaredBodyLength +} from './body' +import { + cleanupLocalControlLayout, + createLocalControlLayout, + createLocalControlToken, + prepareLocalControlLayout, + protectUnixSocket, + writeLocalControlDescriptor, + type CliControlLayout +} from './descriptor' +import { CliRequestError } from './errors' +import { CLI_SURFACE_V1 } from './surface' +import type { CliSurfaceEntry } from './surface' +import type { CliRuntimeStatus } from './routes' +import type { ArtifactSpool } from './artifactSpool' +import type { AgentCliRequestBeginResult, AgentCliRequestGrant } from './agentTokenAuthority' + +const MAX_HEADER_BYTES = 8 * 1024 +const MAX_CONNECTIONS = 64 +const MAX_PENDING_REQUESTS = 64 +const MAX_PENDING_PER_CONNECTION = 8 +const MAX_IN_MEMORY_BODY_BYTES = 256 * 1024 +const REQUEST_TIMEOUT_GRACE_MS = 5_000 +const SHUTDOWN_GRACE_MS = 2_000 +const UNKNOWN_REQUEST_ID = 'unknown' +const emptyAdmission: CliRequestAdmission = Object.freeze({ release: () => undefined }) + +const AgentCliTokenSchema = z + .object({ + tokenId: z + .string() + .min(16) + .max(128) + .regex(/^[A-Za-z0-9_-]+$/), + conversationId: z.string().min(1).max(128), + expiresAt: TimestampMsSchema.max(Number.MAX_SAFE_INTEGER), + scopes: LocalControlScopesSchema + }) + .strict() + +export type CliStreamEmitter = ( + event: string, + data: JsonValue, + context?: Readonly<{ runId?: string; cursor?: string }> +) => Promise + +export type CliUploadedInputFile = Readonly<{ + path: string + size: number +}> + +export type CliServerDependencies = Readonly<{ + userDataPath: string + appVersion: string + dispatch( + method: string, + input: unknown, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise + dispatchStream?( + method: string, + input: unknown, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + emit: CliStreamEmitter + ): Promise + dispatchUpload?( + method: string, + input: unknown, + upload: CliUploadedInputFile, + caller: CliRouteCaller, + signal: AbortSignal + ): Promise + authorize?(input: CliRequestPolicyInput): Promise + surface?: ReadonlyMap + beginAgentRequest?(token: string): AgentCliRequestBeginResult + artifactSpool?: ArtifactSpool + now?: () => number + platform?: NodeJS.Platform + pid?: number + log?: Pick +}> + +type AuthenticationResult = + | Readonly<{ + ok: true + caller: CliRouteCaller + agentGrant?: AgentCliRequestGrant + }> + | Readonly<{ ok: false; quotaExhausted: boolean }> + +function hashToken(token: string): Buffer { + return createHash('sha256').update(token).digest() +} + +function tokensEqual(left: string, right: string): boolean { + return timingSafeEqual(hashToken(left), hashToken(right)) +} + +function readSingularRequestHeader(request: IncomingMessage, name: string): string | null { + const distinctValues = request.headersDistinct[name] + if (distinctValues && distinctValues.length !== 1) return null + const value = distinctValues?.[0] ?? request.headers[name] + return typeof value === 'string' ? value : null +} + +function readBearerToken(request: IncomingMessage): string | null { + const authorization = readSingularRequestHeader(request, 'authorization') + if (!authorization) return null + const match = /^Bearer (\S+)$/.exec(authorization) + if (!match) return null + const token = LocalControlTokenSchema.safeParse(match[1]) + return token.success ? token.data : null +} + +function requestContentTypeIsJson(request: IncomingMessage): boolean { + const contentType = readSingularRequestHeader(request, 'content-type') + if (!contentType) return false + const [mediaType, ...parameters] = contentType.split(';').map((part) => part.trim().toLowerCase()) + if (mediaType !== 'application/json') return false + return parameters.every((parameter) => parameter === 'charset=utf-8') +} + +function requestContentTypeIsBinary(request: IncomingMessage): boolean { + const contentType = readSingularRequestHeader(request, 'content-type') + if (!contentType) return false + return contentType.trim().toLowerCase() === 'application/octet-stream' +} + +function parseUploadRequestHeader(request: IncomingMessage): unknown { + const distinctValues = request.headersDistinct[LOCAL_CONTROL_UPLOAD_REQUEST_HEADER] + if (distinctValues && distinctValues.length !== 1) { + throw new CliRequestError('invalid_request', 'Upload request header must be singular') + } + const rawValue = distinctValues?.[0] ?? request.headers[LOCAL_CONTROL_UPLOAD_REQUEST_HEADER] + if ( + typeof rawValue !== 'string' || + rawValue.length === 0 || + Buffer.byteLength(rawValue, 'ascii') > LOCAL_CONTROL_MAX_UPLOAD_REQUEST_HEADER_BYTES || + !/^[A-Za-z0-9_-]+$/.test(rawValue) + ) { + throw new CliRequestError('invalid_request', 'Upload request header is invalid') + } + + const decoded = Buffer.from(rawValue, 'base64url') + if (decoded.toString('base64url') !== rawValue) { + throw new CliRequestError('invalid_request', 'Upload request header is not canonical') + } + return parseBoundedJsonBytes(decoded) +} + +function readRequestMethodHeader(request: IncomingMessage): string { + const parsed = LocalControlMethodSchema.safeParse( + readSingularRequestHeader(request, LOCAL_CONTROL_METHOD_HEADER) + ) + if (!parsed.success) { + throw new CliRequestError('invalid_request', 'Method header is missing or invalid') + } + return parsed.data +} + +function requestExpectsContinue(request: IncomingMessage): boolean { + return readSingularRequestHeader(request, 'expect')?.trim().toLowerCase() === '100-continue' +} + +function toSafeRequestId(value: unknown): string { + if (typeof value !== 'string') return UNKNOWN_REQUEST_ID + return /^[A-Za-z0-9._:-]{1,128}$/.test(value) ? value : UNKNOWN_REQUEST_ID +} + +function isRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value) +} + +function artifactContentDisposition(filename: string): string { + const ascii = filename.replace(/[^\x20-\x7e]|["\\]/g, '_') + const wellFormedFilename = Buffer.from(filename, 'utf8').toString('utf8') + const encoded = encodeURIComponent(wellFormedFilename).replace( + /[!'()*]/g, + (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}` + ) + return `attachment; filename="${ascii}"; filename*=UTF-8''${encoded}` +} + +function requestAbortError(signal: AbortSignal): CliRequestError { + return signal.reason instanceof CliRequestError + ? signal.reason + : new CliRequestError('cancelled', 'Request was cancelled', { retriable: true }) +} + +function abortRequest(controller: AbortController, error: CliRequestError): void { + if (!controller.signal.aborted) controller.abort(error) +} + +async function runAbortable(signal: AbortSignal, action: () => Promise): Promise { + if (signal.aborted) throw requestAbortError(signal) + + return await new Promise((resolve, reject) => { + let settled = false + const finish = (callback: () => void) => { + if (settled) return + settled = true + signal.removeEventListener('abort', onAbort) + callback() + } + const onAbort = () => finish(() => reject(requestAbortError(signal))) + signal.addEventListener('abort', onAbort, { once: true }) + + void Promise.resolve() + .then(() => { + if (signal.aborted) throw requestAbortError(signal) + return action() + }) + .then( + (value) => finish(() => resolve(value)), + (error: unknown) => finish(() => reject(error)) + ) + }) +} + +export class CliServer { + private readonly now: () => number + private readonly platform: NodeJS.Platform + private readonly pid: number + private readonly log: Pick + private readonly surface: ReadonlyMap + private readonly sockets = new Set() + private readonly connectionIds = new WeakMap() + private readonly pendingByConnection = new Map() + private readonly requestControllers = new Set() + private server: Server | undefined + private layout: CliControlLayout | undefined + private token = '' + private startedAt = 0 + private descriptorReady = false + private pendingRequests = 0 + private startPromise: Promise | undefined + private stopPromise: Promise | undefined + + constructor(private readonly dependencies: CliServerDependencies) { + this.now = dependencies.now ?? Date.now + this.platform = dependencies.platform ?? process.platform + this.pid = dependencies.pid ?? process.pid + this.log = dependencies.log ?? console + this.surface = new Map(dependencies.surface ?? CLI_SURFACE_V1) + } + + getStatus(): CliRuntimeStatus { + const running = this.server?.listening === true + return { + running, + pid: this.pid, + startedAt: this.startedAt, + uptimeMs: running ? Math.max(0, this.now() - this.startedAt) : 0, + endpointKind: this.platform === 'win32' ? 'pipe' : 'unix', + activeConnections: this.sockets.size, + pendingRequests: this.pendingRequests, + descriptorReady: this.descriptorReady + } + } + + getDescriptorPath(): string { + return path.join( + this.dependencies.userDataPath, + 'local-control', + LOCAL_CONTROL_DESCRIPTOR_FILENAME + ) + } + + async start(): Promise { + if (this.stopPromise) await this.stopPromise + if (this.startPromise) return await this.startPromise + + this.startPromise = this.startInternal() + try { + return await this.startPromise + } catch (error) { + this.startPromise = undefined + throw error + } + } + + async stop(): Promise { + if (this.stopPromise) return await this.stopPromise + this.stopPromise = (async () => { + if (this.startPromise) await this.startPromise.catch(() => undefined) + await this.stopInternal() + })() + try { + await this.stopPromise + } finally { + this.stopPromise = undefined + this.startPromise = undefined + } + } + + private async startInternal(): Promise { + const layout = createLocalControlLayout(this.dependencies.userDataPath, this.platform) + const token = createLocalControlToken() + const startedAt = this.now() + await prepareLocalControlLayout(layout, this.platform) + + const serveRequest = (request: IncomingMessage, response: ServerResponse) => { + void this.handleRequest(request, response).catch((error) => { + this.log.error('[CLI] Unhandled request failure', error) + if (!response.headersSent && !response.destroyed) { + this.sendFailure( + response, + 500, + UNKNOWN_REQUEST_ID, + new CliRequestError('internal_error', 'Internal local-control error', { + httpStatus: 500 + }) + ) + } else if (!response.destroyed) { + response.destroy() + } + }) + } + const server = createServer({ maxHeaderSize: MAX_HEADER_BYTES }, serveRequest) + server.on('checkContinue', serveRequest) + server.maxConnections = MAX_CONNECTIONS + server.headersTimeout = 10_000 + server.requestTimeout = LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + REQUEST_TIMEOUT_GRACE_MS + server.keepAliveTimeout = 5_000 + server.on('connection', (socket) => { + this.sockets.add(socket) + this.connectionIds.set(socket, randomUUID()) + socket.once('close', () => { + const connectionId = this.connectionIds.get(socket) + this.sockets.delete(socket) + if (connectionId) this.pendingByConnection.delete(connectionId) + }) + }) + server.on('clientError', (_error, socket) => { + if (!socket.destroyed) { + socket.end('HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Length: 0\r\n\r\n') + } + }) + server.on('error', (error) => { + this.log.error('[CLI] Server error', error) + }) + + this.layout = layout + this.token = token + this.startedAt = startedAt + this.server = server + + try { + await new Promise((resolve, reject) => { + const onError = (error: Error) => reject(error) + server.once('error', onError) + server.listen( + layout.endpoint.kind === 'unix' ? layout.endpoint.path : layout.endpoint.name, + () => { + server.off('error', onError) + resolve() + } + ) + }) + if (layout.endpoint.kind === 'unix') await protectUnixSocket(layout.endpoint.path) + const descriptor = await writeLocalControlDescriptor( + layout, + { + appVersion: this.dependencies.appVersion, + endpoint: layout.endpoint, + pid: this.pid, + token, + startedAt + }, + this.platform + ) + this.descriptorReady = true + return descriptor + } catch (error) { + await this.closeServer(server) + await cleanupLocalControlLayout(layout, token).catch(() => undefined) + this.resetRuntimeState() + throw error + } + } + + private async stopInternal(): Promise { + for (const controller of this.requestControllers) { + abortRequest( + controller, + new CliRequestError('unavailable', 'CLI server is stopping', { + httpStatus: 503, + retriable: true + }) + ) + } + const server = this.server + const layout = this.layout + const token = this.token + this.descriptorReady = false + + if (server) await this.closeServer(server) + if (layout && token) await cleanupLocalControlLayout(layout, token) + this.resetRuntimeState() + } + + private resetRuntimeState(): void { + this.server = undefined + this.layout = undefined + this.token = '' + this.startedAt = 0 + this.descriptorReady = false + this.pendingRequests = 0 + this.pendingByConnection.clear() + this.requestControllers.clear() + this.sockets.clear() + } + + private async closeServer(server: Server): Promise { + if (!server.listening) return + await new Promise((resolve) => { + let settled = false + const finish = () => { + if (settled) return + settled = true + clearTimeout(forceTimer) + clearTimeout(fallbackTimer) + resolve() + } + const forceTimer = setTimeout(() => { + for (const socket of this.sockets) socket.destroy() + server.closeAllConnections() + }, SHUTDOWN_GRACE_MS) + forceTimer.unref() + const fallbackTimer = setTimeout(finish, SHUTDOWN_GRACE_MS + 1_000) + fallbackTimer.unref() + server.close(finish) + server.closeIdleConnections() + }) + } + + private authenticate(request: IncomingMessage, connectionId: string): AuthenticationResult { + const token = readBearerToken(request) + if (!token) return { ok: false, quotaExhausted: false } + if (this.token && tokensEqual(token, this.token)) { + return { + ok: true, + caller: { + kind: 'cli', + principal: 'human', + connectionId, + scopes: LOCAL_CONTROL_SCOPES + } + } + } + + const beginResult = this.dependencies.beginAgentRequest?.(token) + if (beginResult && beginResult.status !== 'granted') { + return { ok: false, quotaExhausted: beginResult.status === 'quota-exhausted' } + } + const grant = beginResult?.status === 'granted' ? beginResult.grant : undefined + const agent = AgentCliTokenSchema.safeParse(grant?.claims) + if (!agent.success || agent.data.expiresAt <= this.now()) { + grant?.release() + return { ok: false, quotaExhausted: false } + } + return { + ok: true, + caller: { + kind: 'cli', + principal: 'agent', + connectionId, + scopes: agent.data.scopes, + tokenId: agent.data.tokenId, + conversationId: agent.data.conversationId, + expiresAt: agent.data.expiresAt + }, + ...(grant ? { agentGrant: grant } : {}) + } + } + + private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise { + response.setHeader('Cache-Control', 'no-store') + response.setHeader('X-Content-Type-Options', 'nosniff') + + const connectionId = this.connectionIds.get(request.socket) ?? randomUUID() + const isRpcRequest = request.method === 'POST' && request.url === LOCAL_CONTROL_RPC_PATH + const isStreamRequest = request.method === 'POST' && request.url === LOCAL_CONTROL_STREAM_PATH + const isUploadRequest = request.method === 'POST' && request.url === LOCAL_CONTROL_UPLOAD_PATH + const isArtifactRequest = + request.method === 'GET' && request.url?.startsWith(LOCAL_CONTROL_ARTIFACT_PATH_PREFIX) + if (!isRpcRequest && !isStreamRequest && !isUploadRequest && !isArtifactRequest) { + this.sendFailure( + response, + 404, + UNKNOWN_REQUEST_ID, + new CliRequestError('not_found', 'Local-control endpoint was not found', { + httpStatus: 404 + }) + ) + return + } + const expectsContinue = requestExpectsContinue(request) + if (request.headers.expect !== undefined && (!isUploadRequest || !expectsContinue)) { + this.sendFailure( + response, + 417, + UNKNOWN_REQUEST_ID, + new CliRequestError('invalid_request', 'Expect is not supported', { + httpStatus: 417 + }) + ) + return + } + + const authentication = this.authenticate(request, connectionId) + if (!authentication.ok) { + this.sendFailure( + response, + authentication.quotaExhausted ? 429 : 401, + UNKNOWN_REQUEST_ID, + authentication.quotaExhausted + ? new CliRequestError('rate_limited', 'Agent CLI token quota is exhausted', { + httpStatus: 429 + }) + : new CliRequestError('authentication_failed', 'Authentication failed', { + httpStatus: 401 + }) + ) + return + } + const { caller, agentGrant } = authentication + if (agentGrant) { + let released = false + const releaseAgentGrant = () => { + if (released) return + released = true + agentGrant.release() + } + response.once('finish', releaseAgentGrant) + response.once('close', releaseAgentGrant) + } + if (isArtifactRequest) { + await this.handleArtifactDownload(request, response, caller) + return + } + const requestTransport = isUploadRequest ? 'upload' : isStreamRequest ? 'stream' : 'rpc' + if ( + (requestTransport === 'upload' && !requestContentTypeIsBinary(request)) || + (requestTransport !== 'upload' && !requestContentTypeIsJson(request)) + ) { + this.sendFailure( + response, + 415, + UNKNOWN_REQUEST_ID, + new CliRequestError( + 'invalid_request', + requestTransport === 'upload' + ? 'Content-Type must be application/octet-stream' + : 'Content-Type must be application/json', + { httpStatus: 415 } + ) + ) + return + } + + const connectionPending = this.pendingByConnection.get(connectionId) ?? 0 + if ( + this.pendingRequests >= MAX_PENDING_REQUESTS || + connectionPending >= MAX_PENDING_PER_CONNECTION + ) { + this.sendFailure( + response, + 429, + UNKNOWN_REQUEST_ID, + new CliRequestError('rate_limited', 'Too many pending local-control requests', { + httpStatus: 429, + retriable: true + }) + ) + return + } + + this.pendingRequests += 1 + this.pendingByConnection.set(connectionId, connectionPending + 1) + const controller = new AbortController() + this.requestControllers.add(controller) + const abort = () => { + abortRequest(controller, new CliRequestError('cancelled', 'Request was cancelled')) + } + const abortRevokedAgentRequest = () => { + abortRequest( + controller, + new CliRequestError('authentication_failed', 'Agent CLI token is no longer valid', { + httpStatus: 401 + }) + ) + } + request.once('aborted', abort) + agentGrant?.signal.addEventListener('abort', abortRevokedAgentRequest, { once: true }) + if (agentGrant?.signal.aborted) abortRevokedAgentRequest() + response.once('close', () => { + if (!response.writableEnded) abort() + }) + + let requestId = UNKNOWN_REQUEST_ID + let routeMethod = 'unknown' + try { + let rawRequest: unknown + let transportBinding: LocalControlUploadBinding | undefined + let declaredMethod: string | undefined + let entry: CliSurfaceEntry | undefined + if (requestTransport === 'upload') { + rawRequest = parseUploadRequestHeader(request) + } else { + declaredMethod = readRequestMethodHeader(request) + routeMethod = declaredMethod + entry = this.surface.get(declaredMethod) + if (!entry || entry.transport !== requestTransport) { + throw new CliRequestError('not_found', 'Method is not exposed by CLI surface V1', { + httpStatus: 404 + }) + } + const body = await readBoundedRequestBody(request, { + maxBytes: entry.limits.maxBodyBytes, + memoryThresholdBytes: Math.min(entry.limits.maxBodyBytes, MAX_IN_MEMORY_BODY_BYTES), + tempDirectory: this.layout?.tempDirectory ?? this.dependencies.userDataPath, + requireContentLength: true, + ...(agentGrant + ? { consumeBytes: (bytes: number) => this.consumeAgentBytes(agentGrant, bytes) } + : {}) + }) + rawRequest = await parseBoundedJsonBody(body) + } + if (isRecord(rawRequest)) requestId = toSafeRequestId(rawRequest.id) + if ( + isRecord(rawRequest) && + (rawRequest.protocolVersion !== LOCAL_CONTROL_PROTOCOL_VERSION || + rawRequest.surfaceVersion !== LOCAL_CONTROL_SURFACE_VERSION) + ) { + throw new CliRequestError( + 'unsupported_version', + `Expected protocol ${LOCAL_CONTROL_PROTOCOL_VERSION} and surface ${LOCAL_CONTROL_SURFACE_VERSION}`, + { httpStatus: 409 } + ) + } + + let rpcRequest: LocalControlRpcRequest + if (requestTransport === 'upload') { + const parsedRequest = LocalControlUploadRequestSchema.safeParse(rawRequest) + if (!parsedRequest.success) { + throw new CliRequestError('invalid_request', 'Request does not match the upload contract') + } + rpcRequest = parsedRequest.data + transportBinding = parsedRequest.data.upload + } else { + const parsedRequest = LocalControlRpcRequestSchema.safeParse(rawRequest) + if (!parsedRequest.success) { + throw new CliRequestError('invalid_request', 'Request does not match the RPC contract') + } + rpcRequest = parsedRequest.data + } + requestId = rpcRequest.id + routeMethod = rpcRequest.method + if (declaredMethod && rpcRequest.method !== declaredMethod) { + throw new CliRequestError( + 'invalid_request', + 'Method header does not match the request body' + ) + } + entry ??= this.surface.get(rpcRequest.method) + if (!entry || entry.transport !== requestTransport) { + throw new CliRequestError('not_found', 'Method is not exposed by CLI surface V1', { + httpStatus: 404 + }) + } + if (transportBinding && transportBinding.size > entry.limits.maxBodyBytes) { + throw new CliRequestError('body_too_large', 'Upload body exceeds method limit', { + httpStatus: 413 + }) + } + if (transportBinding) { + const declaredLength = readDeclaredBodyLength(request) + if (declaredLength !== null && declaredLength !== transportBinding.size) { + throw new CliRequestError( + 'invalid_request', + 'Content-Length does not match the upload binding' + ) + } + } + const parsedInput = entry.contract.input.safeParse(rpcRequest.params) + if (!parsedInput.success) { + throw new CliRequestError('invalid_request', 'Request does not match the route contract') + } + const input = parsedInput.data + const timeout = setTimeout(() => { + abortRequest( + controller, + new CliRequestError('timeout', 'Request timed out', { + httpStatus: 504, + retriable: true + }) + ) + }, entry.limits.timeoutMs) + timeout.unref() + let admission: CliRequestAdmission | undefined + let rawOutput: unknown + try { + admission = await this.authorizeRequest({ + entry, + input, + caller, + requestId, + signal: controller.signal, + ...(transportBinding ? { transportBinding } : {}) + }) + this.assertSurfaceAccess(entry, caller) + if (controller.signal.aborted) throw requestAbortError(controller.signal) + if (requestTransport === 'stream') { + await this.dispatchStreamResponse( + response, + entry, + input, + caller, + requestId, + controller.signal, + agentGrant + ) + return + } + if (requestTransport === 'upload') { + const dispatchUpload = this.dependencies.dispatchUpload + if (!dispatchUpload) { + throw new CliRequestError('unavailable', 'Upload service is unavailable', { + httpStatus: 503, + retriable: true + }) + } + if (expectsContinue) response.writeContinue() + const uploadBody = await readBoundedRequestBody(request, { + maxBytes: entry.limits.maxBodyBytes, + memoryThresholdBytes: 0, + tempDirectory: this.layout?.tempDirectory ?? this.dependencies.userDataPath, + requireContentLength: false, + ...(agentGrant + ? { consumeBytes: (bytes: number) => this.consumeAgentBytes(agentGrant, bytes) } + : {}) + }) + try { + if ( + !transportBinding || + uploadBody.size !== transportBinding.size || + uploadBody.sha256 !== transportBinding.sha256 + ) { + throw new CliRequestError('invalid_request', 'Upload body does not match its binding') + } + if (uploadBody.kind !== 'file') { + throw new CliRequestError('internal_error', 'Upload body was not persisted', { + httpStatus: 500 + }) + } + rawOutput = await runAbortable(controller.signal, async () => + dispatchUpload( + entry.contract.name, + input, + { path: uploadBody.path, size: uploadBody.size }, + caller, + controller.signal + ) + ) + } finally { + await uploadBody.cleanup() + } + } else { + rawOutput = await runAbortable(controller.signal, async () => + this.dependencies.dispatch(entry.contract.name, input, caller, controller.signal) + ) + } + } finally { + admission?.release() + clearTimeout(timeout) + } + if (controller.signal.aborted) { + throw requestAbortError(controller.signal) + } + const result = this.parseRouteOutput(entry, rawOutput, routeMethod) + this.sendJson(response, 200, createLocalControlSuccess(requestId, result), agentGrant) + } catch (error) { + if (error instanceof CliRequestError) { + this.sendFailure(response, error.httpStatus, requestId, error) + } else { + this.log.warn('[CLI] Route dispatch failed', { method: routeMethod }, error) + this.sendFailure( + response, + 500, + requestId, + new CliRequestError('internal_error', 'Internal local-control error', { + httpStatus: 500 + }) + ) + } + } finally { + request.off('aborted', abort) + agentGrant?.signal.removeEventListener('abort', abortRevokedAgentRequest) + this.requestControllers.delete(controller) + this.pendingRequests = Math.max(0, this.pendingRequests - 1) + const remaining = (this.pendingByConnection.get(connectionId) ?? 1) - 1 + if (remaining > 0) this.pendingByConnection.set(connectionId, remaining) + else this.pendingByConnection.delete(connectionId) + } + } + + private assertSurfaceAccess(entry: CliSurfaceEntry, caller: CliRouteCaller): void { + if (!entry.callers.includes(caller.principal)) { + throw new CliRequestError('permission_denied', 'Caller is not allowed for method', { + httpStatus: 403 + }) + } + if (!entry.scopes.every((scope) => caller.scopes.includes(scope))) { + throw new CliRequestError('permission_denied', 'Required scope is missing', { + httpStatus: 403 + }) + } + } + + private async authorizeRequest(input: CliRequestPolicyInput): Promise { + return this.dependencies.authorize ? await this.dependencies.authorize(input) : emptyAdmission + } + + private parseRouteOutput( + entry: CliSurfaceEntry, + rawOutput: unknown, + routeMethod: string + ): JsonValue { + const parsedOutput = entry.contract.output.safeParse(rawOutput) + const parsedResult = parsedOutput.success + ? JsonValueSchema.safeParse(parsedOutput.data) + : { success: false as const } + if (!parsedOutput.success || !parsedResult.success) { + this.log.error('[CLI] Route returned invalid output', { method: routeMethod }) + throw new CliRequestError('internal_error', 'Route returned an invalid result', { + httpStatus: 500 + }) + } + return parsedResult.data as JsonValue + } + + private async dispatchStreamResponse( + response: ServerResponse, + entry: CliSurfaceEntry, + input: unknown, + caller: CliRouteCaller, + requestId: string, + signal: AbortSignal, + agentGrant?: AgentCliRequestGrant + ): Promise { + const dispatchStream = this.dependencies.dispatchStream + if (!dispatchStream) { + throw new CliRequestError('unavailable', 'Streaming service is unavailable', { + httpStatus: 503, + retriable: true + }) + } + + response.statusCode = 200 + response.shouldKeepAlive = false + response.setHeader('Connection', 'close') + response.setHeader('Content-Type', 'application/x-ndjson; charset=utf-8') + response.flushHeaders() + let sequence = 0 + const emit: CliStreamEmitter = async (event, data, context) => { + if (signal.aborted) throw requestAbortError(signal) + const parsed = LocalControlEventEnvelopeSchema.safeParse({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + sequence, + timestamp: this.now(), + requestId, + ...(context?.runId ? { runId: context.runId } : {}), + ...(context?.cursor ? { cursor: context.cursor } : {}), + event, + data + }) + if (!parsed.success) { + throw new CliRequestError('internal_error', 'Stream emitted an invalid event', { + httpStatus: 500 + }) + } + sequence += 1 + await this.writeStreamRecord(response, parsed.data, signal, agentGrant) + } + + try { + const rawOutput = await runAbortable(signal, async () => + dispatchStream(entry.contract.name, input, caller, requestId, signal, emit) + ) + if (signal.aborted) throw requestAbortError(signal) + const result = this.parseRouteOutput(entry, rawOutput, entry.contract.name) + await this.writeStreamRecord( + response, + createLocalControlSuccess(requestId, result), + signal, + agentGrant + ) + } catch (error) { + const failure = signal.aborted + ? requestAbortError(signal) + : error instanceof CliRequestError + ? error + : new CliRequestError('internal_error', 'Streaming operation failed', { + httpStatus: 500 + }) + if (!(error instanceof CliRequestError) && !signal.aborted) { + this.log.warn('[CLI] Stream dispatch failed', { method: entry.contract.name }, error) + } + if (!response.destroyed && !response.writableEnded) { + await this.writeStreamRecord(response, this.createFailureRecord(requestId, failure)).catch( + () => { + if (!response.destroyed) response.destroy() + } + ) + } + } finally { + if (!response.destroyed && !response.writableEnded) response.end() + } + } + + private async writeStreamRecord( + response: ServerResponse, + record: LocalControlStreamRecord, + signal?: AbortSignal, + agentGrant?: AgentCliRequestGrant + ): Promise { + if (signal?.aborted) throw requestAbortError(signal) + const serialized = Buffer.from(`${JSON.stringify(record)}\n`, 'utf8') + if (serialized.length > LOCAL_CONTROL_MAX_STREAM_RECORD_BYTES) { + throw new CliRequestError('internal_error', 'Stream record exceeds its byte limit', { + httpStatus: 500 + }) + } + if (agentGrant) this.consumeAgentBytes(agentGrant, serialized.length) + if (response.destroyed || response.writableEnded) { + throw new CliRequestError('cancelled', 'Stream connection is closed') + } + + await new Promise((resolve, reject) => { + let settled = false + const finish = (error?: Error) => { + if (settled) return + settled = true + signal?.removeEventListener('abort', onAbort) + response.off('error', onError) + response.off('close', onClose) + if (error) reject(error) + else resolve() + } + const onAbort = () => finish(requestAbortError(signal!)) + const onError = (error: Error) => finish(error) + const onClose = () => finish(new CliRequestError('cancelled', 'Stream connection is closed')) + signal?.addEventListener('abort', onAbort, { once: true }) + response.once('error', onError) + response.once('close', onClose) + response.write(serialized, (error) => finish(error ?? undefined)) + }) + } + + private createFailureRecord(requestId: string, error: CliRequestError) { + return createLocalControlFailure(requestId, { + code: error.code, + message: (error.message || 'Local-control request failed').slice(0, 4096), + retriable: error.retriable, + ...(error.options.details ? { details: error.options.details } : {}) + }) + } + + private async handleArtifactDownload( + request: IncomingMessage, + response: ServerResponse, + caller: CliRouteCaller + ): Promise { + const rawId = request.url?.slice(LOCAL_CONTROL_ARTIFACT_PATH_PREFIX.length) ?? '' + const parsedId = ArtifactIdSchema.safeParse(rawId) + const entry = this.surface.get(artifactsReadRoute.name) + if (!parsedId.success || !entry || entry.transport !== 'download') { + this.sendFailure( + response, + 404, + UNKNOWN_REQUEST_ID, + new CliRequestError('not_found', 'Artifact endpoint was not found', { httpStatus: 404 }) + ) + return + } + const contentLength = request.headers['content-length'] + if ( + request.headers['transfer-encoding'] !== undefined || + (contentLength !== undefined && contentLength !== '0') + ) { + this.sendFailure( + response, + 400, + UNKNOWN_REQUEST_ID, + new CliRequestError('invalid_request', 'Artifact downloads do not accept a request body') + ) + return + } + + const connectionPending = this.pendingByConnection.get(caller.connectionId) ?? 0 + if ( + this.pendingRequests >= MAX_PENDING_REQUESTS || + connectionPending >= MAX_PENDING_PER_CONNECTION + ) { + this.sendFailure( + response, + 429, + UNKNOWN_REQUEST_ID, + new CliRequestError('rate_limited', 'Too many pending local-control requests', { + httpStatus: 429, + retriable: true + }) + ) + return + } + + this.pendingRequests += 1 + this.pendingByConnection.set(caller.connectionId, connectionPending + 1) + const controller = new AbortController() + this.requestControllers.add(controller) + const abort = () => { + abortRequest(controller, new CliRequestError('cancelled', 'Request was cancelled')) + } + const abortOnIncompleteResponse = () => { + if (!response.writableEnded) abort() + } + request.once('aborted', abort) + response.once('close', abortOnIncompleteResponse) + const timeout = setTimeout(() => { + abortRequest( + controller, + new CliRequestError('timeout', 'Request timed out', { + httpStatus: 504, + retriable: true + }) + ) + }, entry.limits.timeoutMs) + timeout.unref() + let admission: CliRequestAdmission | undefined + + try { + admission = await this.authorizeRequest({ + entry, + input: { id: parsedId.data }, + caller, + requestId: randomUUID(), + signal: controller.signal + }) + this.assertSurfaceAccess(entry, caller) + if (controller.signal.aborted) throw requestAbortError(controller.signal) + if (!this.dependencies.artifactSpool) { + throw new CliRequestError('unavailable', 'Artifact service is unavailable', { + httpStatus: 503, + retriable: true + }) + } + const artifact = await this.dependencies.artifactSpool.openRead(parsedId.data, caller) + if (controller.signal.aborted) { + artifact.stream.destroy() + throw requestAbortError(controller.signal) + } + response.statusCode = 200 + response.setHeader('Content-Type', artifact.metadata.mimeType) + response.setHeader('Content-Length', artifact.metadata.size) + response.setHeader( + 'Content-Disposition', + artifactContentDisposition(artifact.metadata.filename) + ) + response.setHeader('X-DeepChat-Artifact-Id', artifact.metadata.id) + response.setHeader('X-Content-SHA256', artifact.metadata.sha256) + await pipeline(artifact.stream, response, { signal: controller.signal }) + } catch (error) { + const failure = controller.signal.aborted ? requestAbortError(controller.signal) : error + if (failure instanceof CliRequestError && !response.headersSent) { + this.sendFailure(response, failure.httpStatus, UNKNOWN_REQUEST_ID, failure) + return + } + if (!response.headersSent) { + this.log.warn('[CLI] Artifact download failed', failure) + this.sendFailure( + response, + 500, + UNKNOWN_REQUEST_ID, + new CliRequestError('internal_error', 'Artifact download failed', { httpStatus: 500 }) + ) + return + } + if (!response.destroyed) response.destroy() + } finally { + admission?.release() + clearTimeout(timeout) + request.off('aborted', abort) + response.off('close', abortOnIncompleteResponse) + this.requestControllers.delete(controller) + this.pendingRequests = Math.max(0, this.pendingRequests - 1) + const remaining = (this.pendingByConnection.get(caller.connectionId) ?? 1) - 1 + if (remaining > 0) this.pendingByConnection.set(caller.connectionId, remaining) + else this.pendingByConnection.delete(caller.connectionId) + } + } + + private sendFailure( + response: ServerResponse, + status: number, + requestId: string, + error: CliRequestError + ): void { + this.sendJson(response, status, this.createFailureRecord(requestId, error)) + } + + private sendJson( + response: ServerResponse, + status: number, + body: JsonValue, + agentGrant?: AgentCliRequestGrant + ): void { + if (response.destroyed || response.writableEnded) return + let responseStatus = status + let serialized = Buffer.from(JSON.stringify(body), 'utf8') + if (serialized.length > LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES) { + responseStatus = 500 + serialized = Buffer.from( + JSON.stringify( + createLocalControlFailure( + isRecord(body) ? toSafeRequestId(body.id) : UNKNOWN_REQUEST_ID, + { + code: 'result_too_large', + message: 'Local-control response exceeds its byte limit', + retriable: false + } + ) + ), + 'utf8' + ) + } + if (responseStatus < 400 && agentGrant && !agentGrant.consumeBytes(serialized.length)) { + responseStatus = 429 + serialized = Buffer.from( + JSON.stringify( + createLocalControlFailure( + isRecord(body) ? toSafeRequestId(body.id) : UNKNOWN_REQUEST_ID, + { + code: 'rate_limited', + message: 'Agent CLI token byte quota is exhausted', + retriable: false + } + ) + ), + 'utf8' + ) + } + response.statusCode = responseStatus + if (responseStatus >= 400) { + response.shouldKeepAlive = false + response.setHeader('Connection', 'close') + } + response.setHeader('Content-Type', 'application/json; charset=utf-8') + response.setHeader('Content-Length', serialized.length) + response.end(serialized) + } + + private consumeAgentBytes(grant: AgentCliRequestGrant, bytes: number): void { + if (grant.consumeBytes(bytes)) return + throw new CliRequestError('rate_limited', 'Agent CLI token byte quota is exhausted', { + httpStatus: 429 + }) + } +} diff --git a/src/main/cli/skillService.ts b/src/main/cli/skillService.ts new file mode 100644 index 0000000000..b654ef2863 --- /dev/null +++ b/src/main/cli/skillService.ts @@ -0,0 +1,405 @@ +import { randomUUID } from 'node:crypto' +import { constants, copyFile, link, unlink } from 'node:fs/promises' +import path from 'node:path' +import { + PUBLIC_SKILL_LIST_MAX_ITEMS, + PublicSkillSchema, + skillsInstallPublicUrlRoute, + skillsInstallUploadRoute, + skillsListPublicRoute, + skillsSetPublicStatusRoute, + skillsUninstallPublicRoute, + type PublicSkill, + type SettingsActivityInput +} from '@shared/contracts/routes' +import type { SkillInstallResult, SkillServicePort } from '@shared/types/skill' +import type { UnifiedSkillItem } from '@shared/types/skillManagement' +import { isHardlinkUnavailableError } from '@shared/utils/filesystem' +import { BUILTIN_SKILL_AGENT_ID } from '@/skill/agentSkillRoots' +import { + createRouteMap, + type CliRouteCaller, + type DeepchatRouteMap, + type RouteCaller +} from '@/routes/routeRegistry' +import { CliRequestError } from './errors' +import { compareStableText, sanitizePublicStringList, sanitizePublicText } from './publicText' +import type { CliUploadedInputFile } from './server' + +const PUBLIC_SKILL_DESCRIPTION_BYTES = 1024 +const PUBLIC_SKILL_CATEGORY_BYTES = 128 +const PUBLIC_SKILL_PLATFORM_BYTES = 64 +const PUBLIC_SKILL_TOOL_BYTES = 128 +const PUBLIC_SKILL_PLATFORMS = 32 +const PUBLIC_SKILL_TOOLS = 32 + +type PublicSkillPort = Pick< + SkillServicePort, + | 'getUnifiedSkillCatalog' + | 'installFromUrlForAgent' + | 'installFromZipForAgent' + | 'setSkillDisabledForAgent' + | 'uninstallSkillForAgent' +> + +export type CliSkillServiceOptions = Readonly<{ + skills: PublicSkillPort + agentExists(agentId: string): Promise + recordSettingsActivity?(input: SettingsActivityInput): void + log?: Pick +}> + +function requireCliCaller(caller: RouteCaller): asserts caller is CliRouteCaller { + if (caller.kind !== 'cli') { + throw new CliRequestError('permission_denied', 'Public Skill routes require a CLI caller', { + httpStatus: 403 + }) + } +} + +function requireHumanCliCaller( + caller: RouteCaller +): asserts caller is CliRouteCaller & { principal: 'human' } { + requireCliCaller(caller) + if (caller.principal !== 'human') { + throw new CliRequestError('permission_denied', 'Skill mutation requires a human CLI caller', { + httpStatus: 403 + }) + } +} + +async function removeFileIfPresent(filePath: string): Promise { + try { + await unlink(filePath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } +} + +export async function retainUploadFile( + uploadPath: string, + linkFile: typeof link = link +): Promise> { + const retainedPath = path.join(path.dirname(uploadPath), `body-${randomUUID()}.tmp`) + try { + await linkFile(uploadPath, retainedPath) + } catch (error) { + if (!isHardlinkUnavailableError(error)) throw error + try { + await copyFile(uploadPath, retainedPath, constants.COPYFILE_EXCL) + } catch (copyError) { + await removeFileIfPresent(retainedPath).catch(() => undefined) + throw copyError + } + } + return { path: retainedPath } +} + +function toPublicSkill(skill: UnifiedSkillItem): PublicSkill { + const description = sanitizePublicText(skill.description, PUBLIC_SKILL_DESCRIPTION_BYTES) + const category = skill.category + ? sanitizePublicText(skill.category, PUBLIC_SKILL_CATEGORY_BYTES) + : { value: '', truncated: false } + const platforms = sanitizePublicStringList( + skill.platforms, + PUBLIC_SKILL_PLATFORMS, + PUBLIC_SKILL_PLATFORM_BYTES + ) + const allowedTools = sanitizePublicStringList( + skill.allowedTools, + PUBLIC_SKILL_TOOLS, + PUBLIC_SKILL_TOOL_BYTES + ) + return PublicSkillSchema.parse({ + agentId: skill.agentId, + name: skill.name, + description: description.value, + category: category.value || null, + platforms: platforms.values, + allowedTools: allowedTools.values, + sourceType: skill.sourceType, + enabled: !skill.disabled, + mutable: skill.mutable, + managedBy: + skill.ownerPluginId !== undefined + ? 'plugin' + : skill.sourceType === 'builtin' + ? 'deepchat' + : 'user', + metadataTruncated: + description.truncated || category.truncated || platforms.truncated || allowedTools.truncated + }) +} + +export class CliSkillService { + private readonly log: Pick + + constructor(private readonly options: CliSkillServiceOptions) { + this.log = options.log ?? console + } + + createRoutes(): DeepchatRouteMap { + return createRouteMap([ + [ + skillsListPublicRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = skillsListPublicRoute.input.parse(rawInput) + const catalog = [...(await this.loadCatalog(input.agentId))].sort((left, right) => + compareStableText(left.name, right.name) + ) + return skillsListPublicRoute.output.parse({ + skills: catalog.slice(0, PUBLIC_SKILL_LIST_MAX_ITEMS).map(toPublicSkill), + truncated: catalog.length > PUBLIC_SKILL_LIST_MAX_ITEMS + }) + } + ], + [ + skillsInstallPublicUrlRoute.name, + async (rawInput, context) => { + requireCliCaller(context.caller) + const input = skillsInstallPublicUrlRoute.input.parse(rawInput) + await this.requireAgent(input.agentId) + let result: SkillInstallResult + try { + result = await this.options.skills.installFromUrlForAgent(input.agentId, input.url, { + overwrite: input.overwrite + }) + } catch (error) { + throw this.unavailable('install the Skill', error) + } + const name = this.requireInstallSuccess(result) + this.recordActivity('created', input.agentId, name) + return skillsInstallPublicUrlRoute.output.parse({ + agentId: input.agentId, + name, + installed: true + }) + } + ], + [ + skillsSetPublicStatusRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = skillsSetPublicStatusRoute.input.parse(rawInput) + const skill = await this.requireSkill(input.agentId, input.name) + try { + await this.options.skills.setSkillDisabledForAgent( + input.agentId, + skill.name, + !input.enabled + ) + } catch (error) { + throw this.unavailable('update Skill status', error) + } + this.recordActivity(input.enabled ? 'enabled' : 'disabled', input.agentId, skill.name) + return skillsSetPublicStatusRoute.output.parse({ + agentId: input.agentId, + name: skill.name, + enabled: input.enabled + }) + } + ], + [ + skillsUninstallPublicRoute.name, + async (rawInput, context) => { + requireHumanCliCaller(context.caller) + const input = skillsUninstallPublicRoute.input.parse(rawInput) + const skill = await this.requireSkill(input.agentId, input.name) + if (!skill.mutable) { + throw new CliRequestError('conflict', 'Externally managed Skill cannot be removed', { + httpStatus: 409 + }) + } + let result: SkillInstallResult + try { + result = await this.options.skills.uninstallSkillForAgent(input.agentId, skill.name) + } catch (error) { + throw this.unavailable('remove the Skill', error) + } + this.requireUninstallSuccess(result) + this.recordActivity('removed', input.agentId, skill.name) + return skillsUninstallPublicRoute.output.parse({ + agentId: input.agentId, + name: skill.name, + removed: true + }) + } + ] + ]) + } + + handlesUpload(method: string): boolean { + return method === skillsInstallUploadRoute.name + } + + async dispatchUpload( + method: string, + rawInput: unknown, + upload: CliUploadedInputFile, + caller: RouteCaller, + signal: AbortSignal + ): Promise { + requireHumanCliCaller(caller) + if (!this.handlesUpload(method)) { + throw new CliRequestError('not_found', 'Skill upload method is not implemented', { + httpStatus: 404 + }) + } + const input = skillsInstallUploadRoute.input.parse(rawInput) + signal.throwIfAborted() + await this.requireAgent(input.agentId) + signal.throwIfAborted() + let retainedUpload: Readonly<{ path: string }> + try { + retainedUpload = await retainUploadFile(upload.path) + } catch (error) { + throw this.unavailable('retain the Skill upload', error) + } + try { + let result: SkillInstallResult + try { + result = await this.options.skills.installFromZipForAgent( + input.agentId, + retainedUpload.path, + { overwrite: input.overwrite } + ) + } catch (error) { + throw this.unavailable('install the Skill', error) + } + const name = this.requireInstallSuccess(result) + this.recordActivity('created', input.agentId, name) + return skillsInstallUploadRoute.output.parse({ + agentId: input.agentId, + name, + installed: true + }) + } finally { + await removeFileIfPresent(retainedUpload.path).catch((error) => { + this.log.warn('[CLI] Failed to release retained Skill upload', { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + }) + } + } + + private async requireAgent(agentId: string): Promise { + if (agentId === BUILTIN_SKILL_AGENT_ID) return + let exists: boolean + try { + exists = await this.options.agentExists(agentId) + } catch (error) { + throw this.unavailable('resolve the Skill Agent', error) + } + if (!exists) { + throw new CliRequestError('not_found', 'Skill Agent was not found', { httpStatus: 404 }) + } + } + + private async loadCatalog(agentId: string): Promise { + await this.requireAgent(agentId) + try { + return await this.options.skills.getUnifiedSkillCatalog(agentId) + } catch (error) { + throw this.unavailable('read the Skill catalog', error) + } + } + + private async requireSkill(agentId: string, name: string): Promise { + const skill = (await this.loadCatalog(agentId)).find((candidate) => candidate.name === name) + if (!skill) { + throw new CliRequestError('not_found', 'Skill was not found', { httpStatus: 404 }) + } + return skill + } + + private requireInstallSuccess(result: SkillInstallResult): string { + if (result.success && result.skillName) return result.skillName + switch (result.errorCode) { + case 'conflict': + throw new CliRequestError('conflict', 'Skill conflicts with an existing installation', { + httpStatus: 409 + }) + case 'invalid_skill': + throw new CliRequestError('invalid_request', 'Skill archive is invalid') + case 'not_found': + throw new CliRequestError('not_found', 'Skill archive was not found', { httpStatus: 404 }) + case 'target_locked': + throw new CliRequestError('conflict', 'Skill installation target is busy', { + httpStatus: 409, + retriable: true + }) + case 'io_error': + throw new CliRequestError('unavailable', 'Skill installation failed', { + httpStatus: 503, + retriable: true + }) + default: + throw new CliRequestError('internal_error', 'Skill installer returned an invalid result', { + httpStatus: 500 + }) + } + } + + private requireUninstallSuccess(result: SkillInstallResult): void { + if (result.success) return + switch (result.errorCode) { + case 'not_found': + throw new CliRequestError('not_found', 'Skill was not found', { httpStatus: 404 }) + case 'invalid_skill': + throw new CliRequestError('invalid_request', 'Skill name is invalid') + case 'target_locked': + throw new CliRequestError('conflict', 'Skill installation target is busy', { + httpStatus: 409, + retriable: true + }) + case 'io_error': + throw new CliRequestError('unavailable', 'Skill could not be removed', { + httpStatus: 503, + retriable: true + }) + default: + throw new CliRequestError( + 'internal_error', + 'Skill uninstaller returned an invalid result', + { + httpStatus: 500 + } + ) + } + } + + private unavailable(action: string, error: unknown): CliRequestError { + this.log.warn(`[CLI] Failed to ${action}`, { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + return new CliRequestError('unavailable', `Could not ${action}`, { + httpStatus: 503, + retriable: true + }) + } + + private recordActivity( + action: SettingsActivityInput['action'], + agentId: string, + name: string + ): void { + try { + this.options.recordSettingsActivity?.({ + category: 'knowledge', + action, + targetType: 'skill', + targetId: `${agentId}:${name}`, + targetLabel: name, + routeName: 'settings-skills', + routeParams: { agentId }, + summaryKey: 'settings.controlCenter.activity.settingUpdated', + summaryParams: { key: name } + }) + } catch (error) { + this.log.warn('[CLI] Failed to record Skill activity', { + failure: { name: error instanceof Error ? error.name : typeof error } + }) + } + } +} diff --git a/src/main/cli/surface.ts b/src/main/cli/surface.ts new file mode 100644 index 0000000000..c8eb44fa64 --- /dev/null +++ b/src/main/cli/surface.ts @@ -0,0 +1,1022 @@ +import type { RouteContract } from '@shared/contracts/contract' +import { JsonValueSchema, type JsonValue } from '@shared/contracts/json' +import { + AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES, + OCR_EXTRACTION_MAX_INPUT_BYTES, + PUBLIC_MCP_CONFIG_MAX_BYTES, + PUBLIC_MCP_DESCRIPTION_MAX_CHARACTERS, + PUBLIC_MCP_ICON_MAX_CHARACTERS, + artifactsDeleteRoute, + artifactsDescribeRoute, + artifactsReadRoute, + audioTranscribeArtifactRoute, + audioTranscribeUploadRoute, + cliCapabilitiesRoute, + cliDoctorRoute, + cliStatusRoute, + cliVersionRoute, + imagesGenerateRoute, + modelsGetPublicConfigRoute, + modelsInvokeRoute, + modelsListRuntimeRoute, + modelsResetConfigRoute, + modelsSetPublicConfigRoute, + modelsSetStatusRoute, + mcpAddPublicRoute, + mcpListPublicRoute, + mcpRemovePublicRoute, + mcpSetPublicStatusRoute, + mcpStartPublicRoute, + mcpStopPublicRoute, + mcpUpdatePublicRoute, + ocrClearCacheRoute, + ocrExtractArtifactRoute, + ocrExtractUploadRoute, + ocrGetRuntimeStatusRoute, + providersAddPublicRoute, + providersListPublicRoute, + providersRemoveRoute, + providersSetCredentialRoute, + providersTestPublicConnectionRoute, + providersUpdatePublicRoute, + speechGenerateRoute, + sessionsRunDetachedRoute, + settingsGetPublicRoute, + settingsUpdatePublicRoute, + skillsInstallPublicUrlRoute, + skillsInstallUploadRoute, + skillsListPublicRoute, + skillsSetPublicStatusRoute, + skillsUninstallPublicRoute, + videosGenerateRoute, + eventsSubscribeRoute, + runsCancelRoute, + runsGetRoute, + type CliCapability +} from '@shared/contracts/routes' +import { SKILL_ARCHIVE_MAX_INPUT_BYTES } from '@shared/types/skill' +import { + LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS, + type LocalControlEffect, + type LocalControlPrincipal, + type LocalControlScope +} from '@shared/contracts/localControl' +import { sanitizePublicText, stripC0AndC1Controls } from './publicText' + +export type LocalControlTransport = 'rpc' | 'stream' | 'upload' | 'download' +export type LocalControlApprovalMode = 'never' | 'policy' +export type CliSurfaceEffect = + | LocalControlEffect + | Readonly<{ + possible: readonly LocalControlEffect[] + resolve(input: unknown): LocalControlEffect + }> + +export type CliRouteLimits = Readonly<{ + maxBodyBytes: number + timeoutMs: number +}> + +export type CliSurfaceEntry = Readonly<{ + contract: RouteContract + effect: CliSurfaceEffect + callers: readonly LocalControlPrincipal[] + scopes: readonly LocalControlScope[] + transport: LocalControlTransport + approval: LocalControlApprovalMode + // Agent mutations fail closed unless the operation explicitly opts into a narrow policy path. + agentPolicy?: 'allow' | 'approval' + auditProjection?: (input: unknown) => JsonValue + approvalDisplay?: ( + input: unknown, + caller: Readonly<{ principal: LocalControlPrincipal }> + ) => JsonValue + agentInputAllowed?: (input: unknown) => boolean + limits: CliRouteLimits +}> + +const AGENT_MCP_APPROVAL_MAX_REVIEW_BYTES = 16 * 1024 + +const PREFERENCE_SETTING_KEYS = new Set([ + 'fontSizeLevel', + 'fontFamily', + 'codeFontFamily', + 'artifactsEffectEnabled', + 'autoScrollEnabled', + 'notificationsEnabled', + 'copyWithCotEnabled' +]) + +const EXECUTION_SETTING_KEYS = new Set([ + 'autoCompactionEnabled', + 'autoCompactionTriggerThreshold', + 'autoCompactionRetainRecentPairs', + 'ocrAutoExtractForNonVisionModels', + 'ocrBackend' +]) + +function settingChangeKeys(input: unknown): string[] { + if (!input || typeof input !== 'object' || Array.isArray(input)) return [] + const changes = (input as Record).changes + if (!Array.isArray(changes)) return [] + return changes.flatMap((change) => { + if (!change || typeof change !== 'object' || Array.isArray(change)) return [] + const key = (change as Record).key + return typeof key === 'string' ? [key] : [] + }) +} + +function settingChangesForDisplay(input: unknown): JsonValue { + if (!input || typeof input !== 'object' || Array.isArray(input)) return [] + const changes = (input as Record).changes + if (!Array.isArray(changes)) return [] + return changes.flatMap((change) => { + if (!change || typeof change !== 'object' || Array.isArray(change)) return [] + const { key, value } = change as Record + if ( + typeof key !== 'string' || + !( + value === null || + typeof value === 'string' || + (typeof value === 'number' && Number.isFinite(value)) || + typeof value === 'boolean' + ) + ) { + return [] + } + return [{ key, value }] + }) +} + +function stringArrayField(input: unknown, field: string): string[] { + if (!input || typeof input !== 'object' || Array.isArray(input)) return [] + const value = (input as Record)[field] + return Array.isArray(value) + ? value.filter((entry): entry is string => typeof entry === 'string') + : [] +} + +function objectFieldKeys(input: unknown, field: string): string[] { + if (!input || typeof input !== 'object' || Array.isArray(input)) return [] + const value = (input as Record)[field] + return value && typeof value === 'object' && !Array.isArray(value) + ? Object.keys(value).sort() + : [] +} + +function jsonObjectField(input: unknown, field: string): Record { + if (!input || typeof input !== 'object' || Array.isArray(input)) return {} + const parsed = JsonValueSchema.safeParse((input as Record)[field]) + return parsed.success && + parsed.data && + typeof parsed.data === 'object' && + !Array.isArray(parsed.data) + ? parsed.data + : {} +} + +export function listCliSurfaceEffects(entry: CliSurfaceEntry): readonly LocalControlEffect[] { + return typeof entry.effect === 'string' ? [entry.effect] : entry.effect.possible +} + +export function resolveCliSurfaceEffect( + entry: CliSurfaceEntry, + input: unknown +): LocalControlEffect { + if (typeof entry.effect === 'string') return entry.effect + const resolved = entry.effect.resolve(input) + if (!entry.effect.possible.includes(resolved)) { + throw new Error(`CLI surface effect resolver returned an undeclared effect: ${resolved}`) + } + return resolved +} + +function selectAuditFields(input: unknown, fields: readonly string[]): Record { + if (!input || typeof input !== 'object' || Array.isArray(input)) return {} + const source = input as Record + const selected: Record = {} + for (const field of fields) { + const value = source[field] + if ( + value === null || + typeof value === 'string' || + (typeof value === 'number' && Number.isFinite(value)) || + typeof value === 'boolean' + ) { + selected[field] = value + } + } + return selected +} + +function skillUrlDisplay(input: unknown): JsonValue { + const selected = selectAuditFields(input, ['agentId', 'overwrite']) + if (!input || typeof input !== 'object' || Array.isArray(input)) return selected + const rawUrl = (input as Record).url + if (typeof rawUrl !== 'string') return selected + try { + const url = new URL(rawUrl) + return { + ...selected, + origin: url.origin, + path: url.pathname, + queryPresent: url.search.length > 0 + } + } catch { + return selected + } +} + +function agentSkillUrlInputAllowed(input: unknown): boolean { + if (!input || typeof input !== 'object' || Array.isArray(input)) return false + const rawUrl = (input as Record).url + if (typeof rawUrl !== 'string') return false + try { + const url = new URL(rawUrl) + return ( + url.protocol === 'https:' && + !url.username && + !url.password && + !url.search && + !url.hash && + !containsDirectionalControl(rawUrl) + ) + } catch { + return false + } +} + +function mcpConfigProjection( + input: unknown, + field: 'config' | 'updates', + includeReviewableValues = false +): JsonValue { + const config = jsonObjectField(input, field) + const projection: Record = { + fields: Object.keys(config).sort() + } + if (typeof config.type === 'string') projection.type = config.type + if (typeof config.description === 'string') { + if (includeReviewableValues) { + projection.description = stripC0AndC1Controls( + config.description, + PUBLIC_MCP_DESCRIPTION_MAX_CHARACTERS + ) + projection.descriptionTruncated = false + } else { + const description = sanitizePublicText(config.description, 512) + projection.description = description.value + projection.descriptionTruncated = description.truncated + } + } + if (includeReviewableValues && typeof config.icon === 'string') { + projection.icon = stripC0AndC1Controls(config.icon, PUBLIC_MCP_ICON_MAX_CHARACTERS) + } + if (typeof config.command === 'string') { + const commandName = config.command.split(/[\\/]/).at(-1) ?? '' + projection.commandName = sanitizePublicText(commandName, 256).value + } + if (Array.isArray(config.args)) projection.argumentCount = config.args.length + if (typeof config.inheritEnv === 'string') projection.inheritEnv = config.inheritEnv + if (config.environment && typeof config.environment === 'object') { + projection.environment = mcpKeySummary(config.environment) + } + if (config.headers && typeof config.headers === 'object') { + projection.headers = mcpKeySummary(config.headers) + } + if (typeof config.baseUrl === 'string') { + projection.endpoint = mcpUrlSummary(config.baseUrl) + if (includeReviewableValues) projection.endpointUrl = config.baseUrl + } + if (typeof config.customNpmRegistry === 'string') { + projection.npmRegistry = mcpUrlSummary(config.customNpmRegistry) + } else if (config.customNpmRegistry === null) { + projection.npmRegistry = null + } + if (config.authorization && typeof config.authorization === 'object') { + projection.authorization = selectAuditFields(config.authorization, ['mode']) + } else if (config.authorization === null) { + projection.authorization = null + } + return { + ...selectAuditFields(input, ['serverName']), + [field]: projection + } +} + +function containsDirectionalControl(value: string): boolean { + return /[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u.test(value) +} + +function agentMcpAddInputAllowed(input: unknown): boolean { + const config = jsonObjectField(input, 'config') + const headers = jsonObjectField(config, 'headers') + if ( + (config.type !== 'sse' && config.type !== 'http') || + Object.keys(headers).length > 0 || + config.authorization !== undefined || + typeof config.baseUrl !== 'string' + ) { + return false + } + + let endpoint: URL + try { + endpoint = new URL(config.baseUrl) + } catch { + return false + } + if ( + endpoint.protocol !== 'https:' || + [config.baseUrl, config.description, config.icon].some( + (value) => typeof value === 'string' && containsDirectionalControl(value) + ) + ) { + return false + } + + const reviewableValues: JsonValue = { + type: config.type, + description: config.description ?? '', + icon: config.icon ?? '', + endpointUrl: config.baseUrl + } + return ( + Buffer.byteLength(JSON.stringify(reviewableValues), 'utf8') <= + AGENT_MCP_APPROVAL_MAX_REVIEW_BYTES + ) +} + +function mcpConfigAudit(input: unknown, field: 'config' | 'updates'): JsonValue { + const config = jsonObjectField(input, field) + return { + ...selectAuditFields(input, ['serverName']), + fields: Object.keys(config).sort(), + environment: + config.environment && typeof config.environment === 'object' + ? mcpKeySummary(config.environment) + : { count: 0, names: [], truncated: false }, + headers: + config.headers && typeof config.headers === 'object' + ? mcpKeySummary(config.headers) + : { count: 0, names: [], truncated: false } + } +} + +function mcpKeySummary(value: object): JsonValue { + const keys = Object.keys(value).sort() + const names = keys.slice(0, 16).map((key) => sanitizePublicText(key, 128).value) + return { + count: keys.length, + names, + truncated: keys.length > names.length + } +} + +function mcpUrlSummary(value: string): JsonValue { + try { + const url = new URL(value) + const origin = sanitizePublicText(url.origin, 1024) + return { + origin: origin.value, + pathPresent: url.pathname !== '/', + truncated: origin.truncated + } + } catch { + return { valid: false } + } +} + +const DIAGNOSTIC_LIMITS = { + maxBodyBytes: 16 * 1024, + timeoutMs: 5_000 +} as const satisfies CliRouteLimits + +const APPROVED_MUTATION_LIMITS = { + maxBodyBytes: 16 * 1024, + timeoutMs: 5 * 60_000 +} as const satisfies CliRouteLimits + +const RUN_CONTROL_LIMITS = { + maxBodyBytes: 16 * 1024, + timeoutMs: 30_000 +} as const satisfies CliRouteLimits + +const diagnosticEntry = (contract: RouteContract): CliSurfaceEntry => ({ + contract, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['system:read'], + transport: 'rpc', + approval: 'never', + limits: DIAGNOSTIC_LIMITS +}) + +const mediaEntry = (contract: RouteContract): CliSurfaceEntry => ({ + contract, + effect: 'compute', + callers: ['human', 'agent'], + scopes: ['media:generate'], + transport: 'stream', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId']), + limits: { + maxBodyBytes: 512 * 1024, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } +}) + +const CLI_SURFACE_V1_ENTRIES = [ + { + contract: modelsInvokeRoute, + effect: 'compute', + callers: ['human', 'agent'], + scopes: ['models:invoke'], + transport: 'stream', + approval: 'never', + auditProjection: (input) => { + const selected = selectAuditFields(input, [ + 'providerId', + 'modelId', + 'temperature', + 'maxTokens' + ]) + const messages = + input && typeof input === 'object' && !Array.isArray(input) + ? (input as Record).messages + : undefined + return { ...selected, messageCount: Array.isArray(messages) ? messages.length : 0 } + }, + limits: { maxBodyBytes: 5 * 1024 * 1024, timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS } + }, + mediaEntry(imagesGenerateRoute), + mediaEntry(videosGenerateRoute), + mediaEntry(speechGenerateRoute), + { + contract: audioTranscribeUploadRoute, + effect: 'compute', + callers: ['human'], + scopes: ['audio:transcribe'], + transport: 'upload', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId', 'mimeType']), + limits: { + maxBodyBytes: AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: audioTranscribeArtifactRoute, + effect: 'compute', + callers: ['human', 'agent'], + scopes: ['audio:transcribe', 'artifacts:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId', 'artifactId']), + limits: { + maxBodyBytes: 16 * 1024, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: ocrGetRuntimeStatusRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['ocr:read'], + transport: 'rpc', + approval: 'never', + limits: DIAGNOSTIC_LIMITS + }, + { + contract: ocrExtractUploadRoute, + effect: 'compute', + callers: ['human'], + scopes: ['ocr:extract'], + transport: 'upload', + approval: 'never', + auditProjection: (input) => + selectAuditFields(input, [ + 'mimeType', + 'backend', + 'sourcePageCountHint', + 'generationTokenLimit' + ]), + limits: { + maxBodyBytes: OCR_EXTRACTION_MAX_INPUT_BYTES, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: ocrExtractArtifactRoute, + effect: 'compute', + callers: ['human', 'agent'], + scopes: ['ocr:extract', 'artifacts:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => + selectAuditFields(input, [ + 'artifactId', + 'backend', + 'sourcePageCountHint', + 'generationTokenLimit' + ]), + limits: { + maxBodyBytes: 16 * 1024, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: ocrClearCacheRoute, + effect: 'local-maintenance', + callers: ['human'], + scopes: ['ocr:manage'], + transport: 'rpc', + approval: 'never', + limits: { + maxBodyBytes: 16 * 1024, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: sessionsRunDetachedRoute, + effect: 'compute', + callers: ['human'], + scopes: ['sessions:run'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => { + const source = + input && typeof input === 'object' && !Array.isArray(input) + ? (input as Record) + : {} + const selected = selectAuditFields(input, ['agentId', 'providerId', 'modelId', 'maxTurns']) + return { + ...selected, + promptCharacters: typeof source.prompt === 'string' ? source.prompt.length : 0, + systemPromptPresent: typeof source.systemPrompt === 'string' + } + }, + // Covers worst-case JSON escaping for both bounded prompt fields and all option lists. + limits: { maxBodyBytes: 5 * 1024 * 1024, timeoutMs: 5 * 60_000 } + }, + { + contract: runsGetRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['runs:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['runId', 'limit']), + limits: RUN_CONTROL_LIMITS + }, + { + contract: runsCancelRoute, + effect: 'local-maintenance', + callers: ['human', 'agent'], + scopes: ['runs:cancel'], + transport: 'rpc', + approval: 'never', + agentPolicy: 'allow', + auditProjection: (input) => selectAuditFields(input, ['runId']), + limits: RUN_CONTROL_LIMITS + }, + { + contract: eventsSubscribeRoute, + effect: 'read', + callers: ['human'], + scopes: ['runs:read'], + transport: 'stream', + approval: 'never', + auditProjection: (input) => ({ + ...selectAuditFields(input, ['runId', 'messageLimit']), + cursorPresent: + Boolean(input) && + typeof input === 'object' && + !Array.isArray(input) && + typeof (input as Record).cursor === 'string' + }), + limits: { + maxBodyBytes: 16 * 1024, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: providersListPublicRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['providers:read'], + transport: 'rpc', + approval: 'never', + limits: DIAGNOSTIC_LIMITS + }, + { + contract: providersTestPublicConnectionRoute, + effect: 'compute', + callers: ['human'], + scopes: ['providers:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId']), + limits: { maxBodyBytes: 16 * 1024, timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS } + }, + { + contract: providersAddPublicRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['providers:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['name', 'apiType', 'enabled']), + approvalDisplay: (input) => selectAuditFields(input, ['name', 'apiType', 'baseUrl', 'enabled']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: providersUpdatePublicRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['providers:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => ({ + ...selectAuditFields(input, ['providerId']), + fields: objectFieldKeys(input, 'updates') + }), + approvalDisplay: (input) => ({ + ...selectAuditFields(input, ['providerId']), + updates: jsonObjectField(input, 'updates') + }), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: providersSetCredentialRoute, + effect: 'credential', + callers: ['human'], + scopes: ['providers:credential'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'action', 'kind']), + approvalDisplay: (input) => selectAuditFields(input, ['providerId', 'action', 'kind']), + limits: { maxBodyBytes: 128 * 1024, timeoutMs: APPROVED_MUTATION_LIMITS.timeoutMs } + }, + { + contract: providersRemoveRoute, + effect: 'destructive', + callers: ['human'], + scopes: ['providers:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['providerId']), + approvalDisplay: (input) => selectAuditFields(input, ['providerId']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: modelsListRuntimeRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['models:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['providerId']), + limits: { maxBodyBytes: 16 * 1024, timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS } + }, + { + contract: modelsGetPublicConfigRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['models:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId']), + limits: DIAGNOSTIC_LIMITS + }, + { + contract: modelsSetStatusRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['providers:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId', 'enabled']), + approvalDisplay: (input) => selectAuditFields(input, ['providerId', 'modelId', 'enabled']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: modelsSetPublicConfigRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['providers:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => ({ + ...selectAuditFields(input, ['providerId', 'modelId']), + fields: objectFieldKeys(input, 'config') + }), + approvalDisplay: (input) => ({ + ...selectAuditFields(input, ['providerId', 'modelId']), + config: jsonObjectField(input, 'config') + }), + limits: { maxBodyBytes: 64 * 1024, timeoutMs: APPROVED_MUTATION_LIMITS.timeoutMs } + }, + { + contract: modelsResetConfigRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['providers:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['providerId', 'modelId']), + approvalDisplay: (input) => selectAuditFields(input, ['providerId', 'modelId']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: settingsGetPublicRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['settings:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => ({ keys: stringArrayField(input, 'keys') }), + limits: DIAGNOSTIC_LIMITS + }, + { + contract: settingsUpdatePublicRoute, + effect: { + possible: ['preference-write', 'execution-config', 'security-config'], + resolve: (input) => { + const keys = settingChangeKeys(input) + if (keys.every((key) => PREFERENCE_SETTING_KEYS.has(key))) return 'preference-write' + if (keys.every((key) => EXECUTION_SETTING_KEYS.has(key))) return 'execution-config' + return 'security-config' + } + }, + callers: ['human', 'agent'], + scopes: ['settings:write'], + transport: 'rpc', + approval: 'policy', + agentPolicy: 'approval', + auditProjection: (input) => ({ keys: settingChangeKeys(input) }), + approvalDisplay: (input) => ({ changes: settingChangesForDisplay(input) }), + agentInputAllowed: (input) => + settingChangeKeys(input).every((key) => PREFERENCE_SETTING_KEYS.has(key)), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: skillsListPublicRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['skills:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['agentId']), + limits: DIAGNOSTIC_LIMITS + }, + { + contract: skillsInstallPublicUrlRoute, + effect: 'supply-chain', + callers: ['human', 'agent'], + scopes: ['skills:write'], + transport: 'rpc', + approval: 'policy', + agentPolicy: 'approval', + auditProjection: skillUrlDisplay, + approvalDisplay: skillUrlDisplay, + agentInputAllowed: agentSkillUrlInputAllowed, + limits: { maxBodyBytes: 16 * 1024, timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS } + }, + { + contract: skillsInstallUploadRoute, + effect: 'supply-chain', + callers: ['human'], + scopes: ['skills:write'], + transport: 'upload', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['agentId', 'filename', 'overwrite']), + approvalDisplay: (input) => selectAuditFields(input, ['agentId', 'filename', 'overwrite']), + limits: { + maxBodyBytes: SKILL_ARCHIVE_MAX_INPUT_BYTES, + timeoutMs: LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS + } + }, + { + contract: skillsSetPublicStatusRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['skills:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['agentId', 'name', 'enabled']), + approvalDisplay: (input) => selectAuditFields(input, ['agentId', 'name', 'enabled']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: skillsUninstallPublicRoute, + effect: 'destructive', + callers: ['human'], + scopes: ['skills:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['agentId', 'name']), + approvalDisplay: (input) => selectAuditFields(input, ['agentId', 'name']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: mcpListPublicRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['mcp:read'], + transport: 'rpc', + approval: 'never', + auditProjection: () => ({}), + limits: DIAGNOSTIC_LIMITS + }, + { + contract: mcpAddPublicRoute, + effect: { + possible: ['security-config', 'supply-chain', 'credential'], + resolve: (input) => { + const config = jsonObjectField(input, 'config') + const environment = config.environment + const headers = config.headers + if ( + (environment && typeof environment === 'object' && Object.keys(environment).length > 0) || + (headers && typeof headers === 'object' && Object.keys(headers).length > 0) + ) { + return 'credential' + } + return config.authorization !== undefined ? 'security-config' : 'supply-chain' + } + }, + callers: ['human', 'agent'], + scopes: ['mcp:write'], + transport: 'rpc', + approval: 'policy', + agentPolicy: 'approval', + auditProjection: (input) => mcpConfigAudit(input, 'config'), + approvalDisplay: (input, caller) => + mcpConfigProjection(input, 'config', caller.principal === 'agent'), + agentInputAllowed: agentMcpAddInputAllowed, + limits: { + maxBodyBytes: PUBLIC_MCP_CONFIG_MAX_BYTES + 64 * 1024, + timeoutMs: 5 * 60_000 + } + }, + { + contract: mcpUpdatePublicRoute, + effect: { + possible: ['execution-config', 'security-config', 'supply-chain', 'credential'], + resolve: (input) => { + const fields = new Set(objectFieldKeys(input, 'updates')) + if (fields.has('environment') || fields.has('headers')) return 'credential' + if ( + ['command', 'args', 'type', 'baseUrl', 'customNpmRegistry'].some((field) => + fields.has(field) + ) + ) { + return 'supply-chain' + } + if (fields.has('authorization') || fields.has('inheritEnv')) return 'security-config' + return 'execution-config' + } + }, + callers: ['human'], + scopes: ['mcp:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => mcpConfigAudit(input, 'updates'), + approvalDisplay: (input) => mcpConfigProjection(input, 'updates'), + limits: { + maxBodyBytes: PUBLIC_MCP_CONFIG_MAX_BYTES + 64 * 1024, + timeoutMs: 5 * 60_000 + } + }, + { + contract: mcpRemovePublicRoute, + effect: 'destructive', + callers: ['human'], + scopes: ['mcp:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['serverName']), + approvalDisplay: (input) => selectAuditFields(input, ['serverName']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: mcpSetPublicStatusRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['mcp:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['serverName', 'enabled']), + approvalDisplay: (input) => selectAuditFields(input, ['serverName', 'enabled']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: mcpStartPublicRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['mcp:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['serverName']), + approvalDisplay: (input) => selectAuditFields(input, ['serverName']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: mcpStopPublicRoute, + effect: 'execution-config', + callers: ['human'], + scopes: ['mcp:write'], + transport: 'rpc', + approval: 'policy', + auditProjection: (input) => selectAuditFields(input, ['serverName']), + approvalDisplay: (input) => selectAuditFields(input, ['serverName']), + limits: APPROVED_MUTATION_LIMITS + }, + { + contract: artifactsDescribeRoute, + effect: 'read', + callers: ['human', 'agent'], + scopes: ['artifacts:read'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['id']), + limits: DIAGNOSTIC_LIMITS + }, + { + contract: artifactsReadRoute, + effect: 'read', + callers: ['human'], + scopes: ['artifacts:read'], + transport: 'download', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['id']), + limits: { maxBodyBytes: 1, timeoutMs: 5 * 60_000 } + }, + { + contract: artifactsDeleteRoute, + effect: 'local-maintenance', + callers: ['human'], + scopes: ['artifacts:manage'], + transport: 'rpc', + approval: 'never', + auditProjection: (input) => selectAuditFields(input, ['id']), + limits: DIAGNOSTIC_LIMITS + }, + diagnosticEntry(cliStatusRoute), + diagnosticEntry(cliVersionRoute), + diagnosticEntry(cliCapabilitiesRoute), + diagnosticEntry(cliDoctorRoute) +] as const + +function createSurfaceRegistry( + entries: readonly CliSurfaceEntry[] +): ReadonlyMap { + const registry = new Map() + for (const entry of entries) { + if (registry.has(entry.contract.name)) { + throw new Error(`Duplicate CLI surface method: ${entry.contract.name}`) + } + if (entry.agentPolicy && !entry.callers.includes('agent')) { + throw new Error(`Invalid Agent policy surface: ${entry.contract.name}`) + } + const effects = listCliSurfaceEffects(entry) + if (entry.agentPolicy === 'allow' && effects.some((effect) => effect !== 'local-maintenance')) { + throw new Error(`Invalid Agent allow surface: ${entry.contract.name}`) + } + if ( + entry.agentPolicy === 'approval' && + (entry.approval !== 'policy' || + entry.approvalDisplay === undefined || + !effects.some( + (effect) => + effect === 'preference-write' || + effect === 'security-config' || + effect === 'supply-chain' + )) + ) { + throw new Error(`Invalid Agent approval surface: ${entry.contract.name}`) + } + registry.set(entry.contract.name, entry) + } + return registry +} + +export const CLI_SURFACE_V1 = createSurfaceRegistry(CLI_SURFACE_V1_ENTRIES) + +export function getCliSurfaceEntry(method: string): CliSurfaceEntry | undefined { + return CLI_SURFACE_V1.get(method) +} + +export function listCliSurfaceCapabilities(): CliCapability[] { + return Array.from(CLI_SURFACE_V1.values(), (entry) => ({ + method: entry.contract.name, + possibleEffects: [...listCliSurfaceEffects(entry)], + callers: [...entry.callers], + scopes: [...entry.scopes], + transport: entry.transport, + approval: entry.approval, + maxBodyBytes: entry.limits.maxBodyBytes, + timeoutMs: entry.limits.timeoutMs + })).sort((left, right) => left.method.localeCompare(right.method)) +} diff --git a/src/main/desktop/routes.ts b/src/main/desktop/routes.ts index 46a9c188cc..2a9e9dcb6a 100644 --- a/src/main/desktop/routes.ts +++ b/src/main/desktop/routes.ts @@ -60,7 +60,12 @@ import { type SettingsActivityInput } from '@shared/contracts/routes' import { DEV_EVENTS } from '../events' -import { createRouteMap, type DeepchatRouteMap, type RouteContext } from '@/routes/routeRegistry' +import { + createRouteMap, + requireRendererCaller, + type DeepchatRouteMap, + type RouteContext +} from '@/routes/routeRegistry' import type { DesktopSessionBinding } from '@/desktop/sessionBinding' export function createDesktopRoutes(deps: { @@ -84,14 +89,15 @@ export function createDesktopRoutes(deps: { dialogService } = deps const readWindowState = (context: RouteContext) => { - const window = context.windowId == null ? null : BrowserWindow.fromId(context.windowId) + const caller = requireRendererCaller(context) + const window = caller.windowId == null ? null : BrowserWindow.fromId(caller.windowId) const exists = Boolean(window && !window.isDestroyed()) return { - windowId: context.windowId, + windowId: caller.windowId, exists, isMaximized: exists ? window!.isMaximized() : false, isFullScreen: exists ? window!.isFullScreen() : false, - isFocused: exists ? windowPresenter.isMainWindowFocused(context.windowId!) : false + isFocused: exists ? windowPresenter.isMainWindowFocused(caller.windowId!) : false } } const readBrowserStatus = async (sessionId: string) => @@ -233,9 +239,10 @@ export function createDesktopRoutes(deps: { windowGetRuntimeIdentityRoute.name, async (rawInput, context) => { windowGetRuntimeIdentityRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return windowGetRuntimeIdentityRoute.output.parse({ - windowId: context.windowId, - webContentsId: context.webContentsId + windowId: caller.windowId, + webContentsId: caller.webContentsId }) } ], @@ -243,7 +250,8 @@ export function createDesktopRoutes(deps: { windowMinimizeCurrentRoute.name, async (rawInput, context) => { windowMinimizeCurrentRoute.input.parse(rawInput) - if (context.windowId != null) windowPresenter.minimize(context.windowId) + const caller = requireRendererCaller(context) + if (caller.windowId != null) windowPresenter.minimize(caller.windowId) return windowMinimizeCurrentRoute.output.parse({ state: readWindowState(context) }) } ], @@ -251,7 +259,8 @@ export function createDesktopRoutes(deps: { windowToggleMaximizeCurrentRoute.name, async (rawInput, context) => { windowToggleMaximizeCurrentRoute.input.parse(rawInput) - if (context.windowId != null) windowPresenter.maximize(context.windowId) + const caller = requireRendererCaller(context) + if (caller.windowId != null) windowPresenter.maximize(caller.windowId) return windowToggleMaximizeCurrentRoute.output.parse({ state: readWindowState(context) }) } ], @@ -259,8 +268,9 @@ export function createDesktopRoutes(deps: { windowCloseCurrentRoute.name, async (rawInput, context) => { windowCloseCurrentRoute.input.parse(rawInput) - if (context.windowId == null) return windowCloseCurrentRoute.output.parse({ closed: false }) - windowPresenter.close(context.windowId) + const caller = requireRendererCaller(context) + if (caller.windowId == null) return windowCloseCurrentRoute.output.parse({ closed: false }) + windowPresenter.close(caller.windowId) return windowCloseCurrentRoute.output.parse({ closed: true }) } ], @@ -268,8 +278,9 @@ export function createDesktopRoutes(deps: { windowCloseFloatingCurrentRoute.name, async (rawInput, context) => { windowCloseFloatingCurrentRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) const window = windowPresenter.getFloatingChatWindow()?.getWindow() ?? null - if (!window || window.isDestroyed() || window.webContents.id !== context.webContentsId) { + if (!window || window.isDestroyed() || window.webContents.id !== caller.webContentsId) { return windowCloseFloatingCurrentRoute.output.parse({ closed: false }) } windowPresenter.hide(window.id) @@ -304,7 +315,8 @@ export function createDesktopRoutes(deps: { windowNotifySettingsReadyRoute.name, async (rawInput, context) => { windowNotifySettingsReadyRoute.input.parse(rawInput) - windowPresenter.notifySettingsReady(context.webContentsId) + const caller = requireRendererCaller(context) + windowPresenter.notifySettingsReady(caller.webContentsId) return windowNotifySettingsReadyRoute.output.parse({ notified: true }) } ], @@ -352,6 +364,7 @@ export function createDesktopRoutes(deps: { browserLoadUrlRoute.name, async (rawInput, context) => { const input = browserLoadUrlRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) const browser = browserPresenter as IYoBrowserPresenter & { loadUrl( sessionId: string, @@ -365,7 +378,7 @@ export function createDesktopRoutes(deps: { input.sessionId, input.url, input.timeoutMs, - context.windowId ?? undefined + caller.windowId ?? undefined ) }) } @@ -374,11 +387,12 @@ export function createDesktopRoutes(deps: { browserAttachCurrentWindowRoute.name, async (rawInput, context) => { const input = browserAttachCurrentWindowRoute.input.parse(rawInput) - if (context.windowId == null) { + const caller = requireRendererCaller(context) + if (caller.windowId == null) { return browserAttachCurrentWindowRoute.output.parse({ attached: false }) } return browserAttachCurrentWindowRoute.output.parse({ - attached: await browserPresenter.attachSessionBrowser(input.sessionId, context.windowId) + attached: await browserPresenter.attachSessionBrowser(input.sessionId, caller.windowId) }) } ], @@ -386,12 +400,13 @@ export function createDesktopRoutes(deps: { browserUpdateCurrentWindowBoundsRoute.name, async (rawInput, context) => { const input = browserUpdateCurrentWindowBoundsRoute.input.parse(rawInput) - if (context.windowId == null) { + const caller = requireRendererCaller(context) + if (caller.windowId == null) { return browserUpdateCurrentWindowBoundsRoute.output.parse({ updated: false }) } await browserPresenter.updateSessionBrowserBounds( input.sessionId, - context.windowId, + caller.windowId, input.bounds, input.visible ) @@ -410,11 +425,12 @@ export function createDesktopRoutes(deps: { browserSetPreviewModeRoute.name, async (rawInput, context) => { const input = browserSetPreviewModeRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return browserSetPreviewModeRoute.output.parse( await browserPresenter.setPreviewMode( input.sessionId, input.mode, - context.windowId ?? undefined, + caller.windowId ?? undefined, input.runId ) ) @@ -433,10 +449,11 @@ export function createDesktopRoutes(deps: { computerUseSetPreviewModeRoute.name, async (rawInput, context) => { const input = computerUseSetPreviewModeRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) if ( - context.windowId == null || + caller.windowId == null || (input.mode !== 'stopped' && - deps.desktopSessionBinding.getActiveId(context.webContentsId) !== input.sessionId) + deps.desktopSessionBinding.getActiveId(caller.webContentsId) !== input.sessionId) ) { return computerUseSetPreviewModeRoute.output.parse({ updated: false, @@ -447,7 +464,7 @@ export function createDesktopRoutes(deps: { await computerUsePreviewPresenter.setPreviewMode( input.sessionId, input.mode, - context.windowId + caller.windowId ) ) } @@ -456,8 +473,9 @@ export function createDesktopRoutes(deps: { computerUseDismissPreviewRoute.name, async (rawInput, context) => { const input = computerUseDismissPreviewRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) const active = - deps.desktopSessionBinding.getActiveId(context.webContentsId) === input.sessionId + deps.desktopSessionBinding.getActiveId(caller.webContentsId) === input.sessionId return computerUseDismissPreviewRoute.output.parse({ dismissed: active && computerUsePreviewPresenter.dismissPreview(input.sessionId, input.runId) @@ -535,8 +553,9 @@ export function createDesktopRoutes(deps: { tabCaptureCurrentAreaRoute.name, async (rawInput, context) => { const input = tabCaptureCurrentAreaRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return tabCaptureCurrentAreaRoute.output.parse({ - imageData: await tabPresenter.captureTabArea(context.webContentsId, input.rect) + imageData: await tabPresenter.captureTabArea(caller.webContentsId, input.rect) }) } ], diff --git a/src/main/desktop/sessionBinding.ts b/src/main/desktop/sessionBinding.ts index f4da3b18f3..de0dab33cc 100644 --- a/src/main/desktop/sessionBinding.ts +++ b/src/main/desktop/sessionBinding.ts @@ -27,6 +27,12 @@ export class DesktopSessionBinding { return this.bindings.get(webContentsId) ?? null } + getWebContentsIdsForSession(sessionId: string): number[] { + return Array.from(this.bindings.entries()).flatMap(([webContentsId, boundSessionId]) => + boundSessionId === sessionId ? [webContentsId] : [] + ) + } + async activate(webContentsId: number, sessionId: string): Promise { this.bind(webContentsId, sessionId) this.projection.notify({ diff --git a/src/main/events/sessionEventRouter.ts b/src/main/events/sessionEventRouter.ts new file mode 100644 index 0000000000..5dbb578a45 --- /dev/null +++ b/src/main/events/sessionEventRouter.ts @@ -0,0 +1,129 @@ +import { + SESSION_RUN_STREAM_EVENT_NAMES, + sessionsUpdatedEvent, + type DeepchatEventName +} from '@shared/contracts/events' +import type { TypedEventHub } from './typedEventHub' + +const RUN_STREAM_EVENTS = new Set(SESSION_RUN_STREAM_EVENT_NAMES) + +type SessionEventRouterOptions = Readonly<{ + hub: TypedEventHub + // string: CLI run root; null: known renderer session; undefined: unknown/deleted session. + resolveSessionRunId(sessionId: string): string | null | undefined + getBoundRendererIds(sessionId: string): readonly number[] +}> + +const MAX_OWNERSHIP_CACHE_ENTRIES = 4_096 + +function isRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value) +} + +function sessionIdsForEvent(name: DeepchatEventName, payload: unknown): string[] { + if (!isRecord(payload)) return [] + if (name === 'sessions.updated') { + return Array.isArray(payload.sessionIds) + ? payload.sessionIds.filter((value): value is string => typeof value === 'string') + : [] + } + if (typeof payload.sessionId === 'string') return [payload.sessionId] + if (typeof payload.conversationId === 'string') return [payload.conversationId] + return [] +} + +export class SessionEventRouter { + private readonly ownershipCache = new Map() + + constructor(private readonly options: SessionEventRouterOptions) {} + + publish(name: DeepchatEventName, payload: unknown): void { + const sessionIds = sessionIdsForEvent(name, payload) + if (name === 'sessions.updated') { + for (const sessionId of sessionIds) this.ownershipCache.delete(sessionId) + } + const ownership = sessionIds.map((sessionId) => ({ + sessionId, + runId: this.resolveSessionRunId(sessionId) + })) + const cliRunOwnership = ownership.flatMap(({ sessionId, runId }) => { + return runId ? [{ sessionId, runId }] : [] + }) + const unknownSessionIds = ownership.flatMap(({ sessionId, runId }) => + runId === undefined ? [sessionId] : [] + ) + if (cliRunOwnership.length === 0 && unknownSessionIds.length === 0) { + this.options.hub.publish(name, payload, { kind: 'renderer-all' }) + return + } + + if (name === 'sessions.updated') { + this.publishSessionsUpdated(sessionsUpdatedEvent.payload.parse(payload), unknownSessionIds) + return + } + + if (cliRunOwnership.length === 0) return + + if (RUN_STREAM_EVENTS.has(name)) { + for (const runId of new Set(cliRunOwnership.map((ownership) => ownership.runId))) { + this.options.hub.publish(name, payload, { kind: 'run', runId }) + } + } + this.publishToBoundRenderers( + name, + payload, + cliRunOwnership.map(({ sessionId }) => sessionId) + ) + } + + private resolveSessionRunId(sessionId: string): string | null | undefined { + if (this.ownershipCache.has(sessionId)) { + const cached = this.ownershipCache.get(sessionId)! + this.ownershipCache.delete(sessionId) + this.ownershipCache.set(sessionId, cached) + return cached + } + + const runId = this.options.resolveSessionRunId(sessionId) + if (runId === undefined) return undefined + this.ownershipCache.set(sessionId, runId) + while (this.ownershipCache.size > MAX_OWNERSHIP_CACHE_ENTRIES) { + const oldest = this.ownershipCache.keys().next().value + if (oldest === undefined) break + this.ownershipCache.delete(oldest) + } + return runId + } + + private publishSessionsUpdated( + payload: ReturnType, + unknownSessionIds: readonly string[] + ): void { + if (payload.reason === 'deleted') { + this.options.hub.publish('sessions.updated', payload, { kind: 'renderer-all' }) + return + } + const unknownIds = new Set(unknownSessionIds) + const knownSessionIds = payload.sessionIds.filter((sessionId) => !unknownIds.has(sessionId)) + if (knownSessionIds.length > 0) { + this.options.hub.publish( + 'sessions.updated', + { ...payload, sessionIds: knownSessionIds }, + { kind: 'renderer-all' } + ) + } + } + + private publishToBoundRenderers( + name: DeepchatEventName, + payload: unknown, + sessionIds: readonly string[] + ): void { + const rendererIds = new Set( + sessionIds.flatMap((sessionId) => [...this.options.getBoundRendererIds(sessionId)]) + ) + for (const webContentsId of rendererIds) { + this.options.hub.publish(name, payload, { kind: 'renderer', webContentsId }) + } + } +} diff --git a/src/main/events/typedEventHub.ts b/src/main/events/typedEventHub.ts new file mode 100644 index 0000000000..8a74beb2cc --- /dev/null +++ b/src/main/events/typedEventHub.ts @@ -0,0 +1,497 @@ +import { randomUUID } from 'node:crypto' +import { + createDeepchatEventEnvelope, + type DeepchatEventEnvelope, + type DeepchatEventName +} from '@shared/contracts/events' +import { JsonValueSchema, type JsonValue } from '@shared/contracts/json' + +export type TypedEventTarget = + | Readonly<{ kind: 'renderer-all' }> + | Readonly<{ kind: 'renderer'; webContentsId: number }> + | Readonly<{ kind: 'cli-connection'; connectionId: string }> + | Readonly<{ kind: 'request'; connectionId: string; requestId: string }> + | Readonly<{ kind: 'run'; runId: string }> + | Readonly<{ kind: 'internal'; subscriberId: string }> + +export type TypedEventStreamTarget = Exclude< + TypedEventTarget, + { kind: 'renderer-all' } | { kind: 'renderer' } +> + +export type TypedEventRecord = Readonly<{ + target: TypedEventStreamTarget + sequence: number + cursor: string + timestamp: number + event: DeepchatEventName + data: JsonValue +}> + +export type TypedEventRecoveryReason = + | 'cursor_missing' + | 'cursor_expired' + | 'cursor_ahead' + | 'server_restarted' + +export type TypedEventSubscription = Readonly<{ + initialCursor: string + recoveryReason: TypedEventRecoveryReason | null + events: AsyncIterable + close(): void +}> + +export class TypedEventHubOverflowError extends Error { + constructor(message = 'Event subscriber queue overflowed') { + super(message) + this.name = 'TypedEventHubOverflowError' + } +} + +export class TypedEventHubCapacityError extends Error { + constructor(message = 'Event subscriber capacity is exhausted') { + super(message) + this.name = 'TypedEventHubCapacityError' + } +} + +export type TypedEventHubOptions = Readonly<{ + renderer: Readonly<{ + broadcast(envelope: DeepchatEventEnvelope): void | Promise + send(webContentsId: number, envelope: DeepchatEventEnvelope): void | Promise + }> + epoch?: string + now?: () => number + maxStreams?: number + maxSubscribers?: number + maxRetainedEvents?: number + maxRetainedBytes?: number + maxTotalRetainedBytes?: number + maxSubscriberEvents?: number + maxSubscriberBytes?: number + streamIdleTtlMs?: number + log?: Pick +}> + +type StreamState = { + target: TypedEventStreamTarget + cursorEpoch: string + sequence: number + retained: RetainedEvent[] + retainedBytes: number + subscribers: Set + lastUsedAt: number +} + +type RetainedEvent = Readonly<{ + record: TypedEventRecord + bytes: number + order: number + coalescingKey: string | null +}> + +type PendingNext = Readonly<{ + resolve(value: IteratorResult): void + reject(error: Error): void +}> + +const DEFAULT_MAX_STREAMS = 128 +const DEFAULT_MAX_SUBSCRIBERS = 64 +const DEFAULT_MAX_RETAINED_EVENTS = 256 +const DEFAULT_MAX_RETAINED_BYTES = 4 * 1024 * 1024 +const DEFAULT_MAX_TOTAL_RETAINED_BYTES = 32 * 1024 * 1024 +const DEFAULT_MAX_SUBSCRIBER_EVENTS = 64 +const DEFAULT_MAX_SUBSCRIBER_BYTES = 1024 * 1024 +const DEFAULT_STREAM_IDLE_TTL_MS = 30 * 60_000 +const MAX_STREAM_SWEEP_INTERVAL_MS = 60_000 + +function targetKey(target: TypedEventStreamTarget): string { + const field = (value: string): string => `${value.length}:${value}` + switch (target.kind) { + case 'cli-connection': + return `connection:${field(target.connectionId)}` + case 'request': + return `request:${field(target.connectionId)}:${field(target.requestId)}` + case 'run': + return `run:${field(target.runId)}` + case 'internal': + return `internal:${field(target.subscriberId)}` + } +} + +function recordSize(record: TypedEventRecord): number { + return Buffer.byteLength(JSON.stringify(record), 'utf8') +} + +function retainedEventCoalescingKey(record: TypedEventRecord): string | null { + if (record.event !== 'chat.stream.updated') return null + if (!record.data || typeof record.data !== 'object' || Array.isArray(record.data)) return null + const messageId = record.data.messageId + return typeof messageId === 'string' ? `${record.event}:${messageId}` : null +} + +class EventSubscriber implements AsyncIterator, AsyncIterable { + private readonly queue: Array<{ record: TypedEventRecord; bytes: number }> = [] + private queuedBytes = 0 + private pending: PendingNext | null = null + private closed = false + private failure: Error | null = null + + constructor( + initialRecords: readonly RetainedEvent[], + private readonly limits: { maxEvents: number; maxBytes: number }, + private readonly onClose: () => void + ) { + for (const { record, bytes } of initialRecords) { + this.queue.push({ record, bytes }) + this.queuedBytes += bytes + } + } + + [Symbol.asyncIterator](): AsyncIterator { + return this + } + + next(): Promise> { + if (this.failure) return Promise.reject(this.failure) + const queued = this.queue.shift() + if (queued) { + this.queuedBytes -= queued.bytes + return Promise.resolve({ value: queued.record, done: false }) + } + if (this.closed) return Promise.resolve({ value: undefined, done: true }) + if (this.pending) { + return Promise.reject(new Error('Concurrent event subscription reads are not supported')) + } + return new Promise>((resolve, reject) => { + this.pending = { resolve, reject } + }) + } + + return(): Promise> { + this.close() + return Promise.resolve({ value: undefined, done: true }) + } + + enqueue(record: TypedEventRecord, bytes: number): void { + if (this.closed || this.failure) return + if (bytes > this.limits.maxBytes) { + this.fail(new TypedEventHubOverflowError('Event exceeds the subscriber byte limit')) + return + } + if (this.pending) { + const pending = this.pending + this.pending = null + pending.resolve({ value: record, done: false }) + return + } + + if ( + this.queue.length >= this.limits.maxEvents || + this.queuedBytes + bytes > this.limits.maxBytes + ) { + this.fail(new TypedEventHubOverflowError()) + return + } + this.queue.push({ record, bytes }) + this.queuedBytes += bytes + } + + fail(error: Error): void { + if (this.closed || this.failure) return + this.failure = error + this.queue.length = 0 + this.queuedBytes = 0 + const pending = this.pending + this.pending = null + this.onClose() + pending?.reject(error) + } + + close(): void { + if (this.closed) return + this.closed = true + this.queue.length = 0 + this.queuedBytes = 0 + const pending = this.pending + this.pending = null + this.onClose() + pending?.resolve({ value: undefined, done: true }) + } +} + +export class TypedEventHub { + private readonly epoch: string + private readonly now: () => number + private readonly maxStreams: number + private readonly maxSubscribers: number + private readonly maxRetainedEvents: number + private readonly maxRetainedBytes: number + private readonly maxTotalRetainedBytes: number + private readonly maxSubscriberEvents: number + private readonly maxSubscriberBytes: number + private readonly streamIdleTtlMs: number + private readonly streamSweepTimer: NodeJS.Timeout + private readonly log: Pick + private readonly streams = new Map() + private subscriberCount = 0 + private totalRetainedBytes = 0 + private streamIncarnation = 0 + private retentionOrder = 0 + + constructor(private readonly options: TypedEventHubOptions) { + this.epoch = options.epoch ?? randomUUID() + this.now = options.now ?? Date.now + this.maxStreams = options.maxStreams ?? DEFAULT_MAX_STREAMS + this.maxSubscribers = options.maxSubscribers ?? DEFAULT_MAX_SUBSCRIBERS + this.maxRetainedEvents = options.maxRetainedEvents ?? DEFAULT_MAX_RETAINED_EVENTS + this.maxRetainedBytes = options.maxRetainedBytes ?? DEFAULT_MAX_RETAINED_BYTES + this.maxTotalRetainedBytes = options.maxTotalRetainedBytes ?? DEFAULT_MAX_TOTAL_RETAINED_BYTES + this.maxSubscriberEvents = options.maxSubscriberEvents ?? DEFAULT_MAX_SUBSCRIBER_EVENTS + this.maxSubscriberBytes = options.maxSubscriberBytes ?? DEFAULT_MAX_SUBSCRIBER_BYTES + this.streamIdleTtlMs = options.streamIdleTtlMs ?? DEFAULT_STREAM_IDLE_TTL_MS + this.log = options.log ?? console + this.streamSweepTimer = setInterval( + () => this.pruneExpiredStreams(), + Math.max(1_000, Math.min(this.streamIdleTtlMs, MAX_STREAM_SWEEP_INTERVAL_MS)) + ) + this.streamSweepTimer.unref() + } + + publish(name: DeepchatEventName, payload: unknown, target: TypedEventTarget): void { + const envelope = createDeepchatEventEnvelope(name, payload) + if (target.kind === 'renderer-all') { + this.deliver(() => this.options.renderer.broadcast(envelope), name, target) + return + } + if (target.kind === 'renderer') { + this.deliver(() => this.options.renderer.send(target.webContentsId, envelope), name, target) + return + } + + const data = JsonValueSchema.parse(envelope.payload) + const state = this.getOrCreateStream(target) + state.sequence += 1 + state.lastUsedAt = this.now() + const record: TypedEventRecord = { + target, + sequence: state.sequence, + cursor: this.cursor(state, state.sequence), + timestamp: state.lastUsedAt, + event: name, + data + } + const bytes = recordSize(record) + + if (bytes <= this.maxRetainedBytes && bytes <= this.maxTotalRetainedBytes) { + this.retain(state, record, bytes) + } + + for (const subscriber of Array.from(state.subscribers)) subscriber.enqueue(record, bytes) + } + + subscribe( + target: TypedEventStreamTarget, + options: { afterCursor?: string; signal?: AbortSignal } = {} + ): TypedEventSubscription { + if (this.subscriberCount >= this.maxSubscribers) throw new TypedEventHubCapacityError() + const state = this.getOrCreateStream(target) + const recovery = this.resolveRecovery(state, options.afterCursor) + let initialRecords = + recovery.sequence === null + ? [] + : state.retained.filter((item) => item.record.sequence > recovery.sequence!) + if (!this.recordsFitSubscriber(initialRecords)) { + recovery.reason = 'cursor_expired' + recovery.sequence = null + initialRecords = [] + } + + let subscriber!: EventSubscriber + let abortListener: (() => void) | undefined + const close = () => { + if (!state.subscribers.delete(subscriber)) return + this.subscriberCount -= 1 + if (abortListener) options.signal?.removeEventListener('abort', abortListener) + this.trimStreamCapacity() + } + subscriber = new EventSubscriber( + initialRecords, + { maxEvents: this.maxSubscriberEvents, maxBytes: this.maxSubscriberBytes }, + close + ) + state.subscribers.add(subscriber) + state.lastUsedAt = this.now() + this.subscriberCount += 1 + if (options.signal?.aborted) subscriber.close() + else { + abortListener = () => subscriber.close() + options.signal?.addEventListener('abort', abortListener, { once: true }) + } + + return { + initialCursor: this.cursor(state, state.sequence), + recoveryReason: recovery.reason, + events: subscriber, + close: () => subscriber.close() + } + } + + close(): void { + clearInterval(this.streamSweepTimer) + for (const state of this.streams.values()) { + for (const subscriber of Array.from(state.subscribers)) subscriber.close() + } + this.streams.clear() + this.totalRetainedBytes = 0 + } + + private deliver( + action: () => void | Promise, + name: DeepchatEventName, + target: TypedEventTarget + ): void { + try { + void Promise.resolve(action()).catch((error) => { + this.log.warn('[TypedEventHub] Renderer delivery failed', { name, target, error }) + }) + } catch (error) { + this.log.warn('[TypedEventHub] Renderer delivery failed', { name, target, error }) + } + } + + private cursor(state: StreamState, sequence: number): string { + return `${state.cursorEpoch}:${sequence}` + } + + private getOrCreateStream(target: TypedEventStreamTarget): StreamState { + this.pruneExpiredStreams() + const key = targetKey(target) + const existing = this.streams.get(key) + if (existing) return existing + + this.trimStreamCapacity(1) + const state: StreamState = { + target, + cursorEpoch: `${this.epoch}_${++this.streamIncarnation}`, + sequence: 0, + retained: [], + retainedBytes: 0, + subscribers: new Set(), + lastUsedAt: this.now() + } + this.streams.set(key, state) + return state + } + + private resolveRecovery( + state: StreamState, + cursor: string | undefined + ): { reason: TypedEventRecoveryReason | null; sequence: number | null } { + if (!cursor) return { reason: 'cursor_missing', sequence: null } + const separator = cursor.lastIndexOf(':') + const epoch = separator > 0 ? cursor.slice(0, separator) : '' + const rawSequence = separator > 0 ? cursor.slice(separator + 1) : '' + const sequence = /^(?:0|[1-9][0-9]*)$/.test(rawSequence) ? Number(rawSequence) : Number.NaN + if (epoch !== state.cursorEpoch) { + const sameHub = epoch === this.epoch || epoch.startsWith(`${this.epoch}_`) + return { reason: sameHub ? 'cursor_expired' : 'server_restarted', sequence: null } + } + if (!Number.isSafeInteger(sequence) || sequence < 0) { + return { reason: 'cursor_expired', sequence: null } + } + if (sequence > state.sequence) return { reason: 'cursor_ahead', sequence: null } + + const oldestSequence = state.retained[0]?.record.sequence ?? state.sequence + 1 + if (sequence < oldestSequence - 1) return { reason: 'cursor_expired', sequence: null } + return { reason: null, sequence } + } + + private recordsFitSubscriber(records: readonly RetainedEvent[]): boolean { + if (records.length > this.maxSubscriberEvents) return false + let bytes = 0 + for (const record of records) { + bytes += record.bytes + if (bytes > this.maxSubscriberBytes) return false + } + return true + } + + private retain(state: StreamState, record: TypedEventRecord, bytes: number): void { + const coalescingKey = retainedEventCoalescingKey(record) + if (coalescingKey) { + const supersededIndex = state.retained.findIndex( + (item) => item.coalescingKey === coalescingKey + ) + if (supersededIndex >= 0) this.removeRetainedAt(state, supersededIndex) + } + + state.retained.push({ + record, + bytes, + order: ++this.retentionOrder, + coalescingKey + }) + state.retainedBytes += bytes + this.totalRetainedBytes += bytes + while ( + state.retained.length > this.maxRetainedEvents || + state.retainedBytes > this.maxRetainedBytes + ) { + this.removeRetainedAt(state, 0) + } + this.trimTotalRetainedBytes() + } + + private trimTotalRetainedBytes(): void { + while (this.totalRetainedBytes > this.maxTotalRetainedBytes) { + let candidate: StreamState | undefined + let oldestOrder = Number.POSITIVE_INFINITY + for (const state of this.streams.values()) { + const order = state.retained[0]?.order + if (order !== undefined && order < oldestOrder) { + candidate = state + oldestOrder = order + } + } + if (!candidate) break + this.removeRetainedAt(candidate, 0) + } + } + + private removeRetainedAt(state: StreamState, index: number): void { + const [removed] = state.retained.splice(index, 1) + if (!removed) return + state.retainedBytes -= removed.bytes + this.totalRetainedBytes -= removed.bytes + } + + private pruneExpiredStreams(): void { + const expirationThreshold = this.now() - this.streamIdleTtlMs + for (const [key, state] of this.streams) { + if (state.subscribers.size === 0 && state.lastUsedAt < expirationThreshold) { + this.removeStream(key, state) + } + } + } + + private removeStream(key: string, state: StreamState): void { + if (!this.streams.delete(key)) return + this.totalRetainedBytes -= state.retainedBytes + } + + private trimStreamCapacity(additionalStreams = 0): void { + while (this.streams.size + additionalStreams > this.maxStreams) { + const candidate = Array.from(this.streams.entries()) + .filter(([, state]) => state.subscribers.size === 0) + .sort((left, right) => left[1].lastUsedAt - right[1].lastUsedAt)[0] + if (!candidate) { + if (additionalStreams > 0) { + throw new TypedEventHubCapacityError('Event stream capacity is exhausted') + } + return + } + this.removeStream(candidate[0], candidate[1]) + } + } +} diff --git a/src/main/mcp/routes.ts b/src/main/mcp/routes.ts index f914b439e1..2b0d9ad0a0 100644 --- a/src/main/mcp/routes.ts +++ b/src/main/mcp/routes.ts @@ -64,7 +64,12 @@ import { mcpUpdateServerRoute, type SettingsActivityInput } from '@shared/contracts/routes' -import { createRouteMap, type DeepchatRouteMap, type RouteContext } from '@/routes/routeRegistry' +import { + createRouteMap, + requireRendererCaller, + type DeepchatRouteMap, + type RouteContext +} from '@/routes/routeRegistry' import { assertBoundedMcpJson } from './schemaValidation' const MCP_APP_ROUTE_INPUT_MAX_BYTES = 3 * 1024 * 1024 @@ -81,16 +86,18 @@ export function createMcpRoutes(deps: { }): DeepchatRouteMap { const { mcpService } = deps const appContext = (context: RouteContext) => { - if (context.windowId === null || deps.isSettingsWindow(context.windowId)) { + const caller = requireRendererCaller(context) + if (caller.windowId === null || deps.isSettingsWindow(caller.windowId)) { throw new Error('MCP Apps are restricted to conversation windows') } return { - webContentsId: context.webContentsId, - windowId: context.windowId + webContentsId: caller.webContentsId, + windowId: caller.windowId } } const assertSettingsWindow = (context: RouteContext): void => { - if (!deps.isSettingsWindow(context.windowId)) { + const caller = requireRendererCaller(context) + if (!deps.isSettingsWindow(caller.windowId)) { throw new Error('MCP credential changes are restricted to the settings window') } } diff --git a/src/main/notifications/electronWindowNotificationTargets.ts b/src/main/notifications/electronWindowNotificationTargets.ts index 0666af90a2..66288d5ea5 100644 --- a/src/main/notifications/electronWindowNotificationTargets.ts +++ b/src/main/notifications/electronWindowNotificationTargets.ts @@ -1,6 +1,11 @@ import { BrowserWindow, webContents as electronWebContents, type WebContents } from 'electron' import { DEEPCHAT_EVENT_CHANNEL } from '@shared/contracts/channels' -import { createDeepchatEventEnvelope, semanticNotificationEvent } from '@shared/contracts/events' +import { + createDeepchatEventEnvelope, + semanticNotificationEvent, + type DeepchatEventName, + type DeepchatEventPayload +} from '@shared/contracts/events' import type { ITabPresenter, IWindowPresenter } from '@shared/types/desktop' import type { SemanticNotificationDelivery } from '@shared/notifications' import type { @@ -122,6 +127,14 @@ export class ElectronWindowNotificationTargets implements WindowNotificationTarg async send( target: NotificationWindowTarget, delivery: SemanticNotificationDelivery + ): Promise { + return await this.sendDeepchatEvent(target, semanticNotificationEvent.name, delivery) + } + + async sendDeepchatEvent( + target: NotificationWindowTarget, + eventName: T, + payload: DeepchatEventPayload ): Promise { const current = await this.getTargetByWebContents(target.webContentsId) if (!current || current.kind !== target.kind || current.windowId !== target.windowId) { @@ -131,7 +144,7 @@ export class ElectronWindowNotificationTargets implements WindowNotificationTarg return await this.windows.sendToWebContents( target.webContentsId, DEEPCHAT_EVENT_CHANNEL, - createDeepchatEventEnvelope(semanticNotificationEvent.name, delivery) + createDeepchatEventEnvelope(eventName, payload) ) } diff --git a/src/main/notifications/routes.ts b/src/main/notifications/routes.ts index 8e4e788979..edd9319066 100644 --- a/src/main/notifications/routes.ts +++ b/src/main/notifications/routes.ts @@ -2,7 +2,7 @@ import { notificationAcknowledgePresentationRoute, notificationRendererReadyRoute } from '@shared/contracts/routes' -import { createRouteMap } from '@/routes/routeRegistry' +import { createRouteMap, requireRendererCaller } from '@/routes/routeRegistry' export type NotificationRoutesDependencies = Readonly<{ rendererReady: (webContentsId: number) => Promise @@ -15,8 +15,9 @@ export const createNotificationRoutes = (dependencies: NotificationRoutesDepende notificationRendererReadyRoute.name, async (rawInput, context) => { notificationRendererReadyRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return notificationRendererReadyRoute.output.parse({ - ready: await dependencies.rendererReady(context.webContentsId) + ready: await dependencies.rendererReady(caller.webContentsId) }) } ], @@ -24,10 +25,11 @@ export const createNotificationRoutes = (dependencies: NotificationRoutesDepende notificationAcknowledgePresentationRoute.name, async (rawInput, context) => { const input = notificationAcknowledgePresentationRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return notificationAcknowledgePresentationRoute.output.parse({ accepted: await dependencies.acknowledgePresentation( input.episodeId, - context.webContentsId + caller.webContentsId ) }) } diff --git a/src/main/ocr/ocrRuntimeService.ts b/src/main/ocr/ocrRuntimeService.ts index 5a1adf422f..054210dee5 100644 --- a/src/main/ocr/ocrRuntimeService.ts +++ b/src/main/ocr/ocrRuntimeService.ts @@ -45,6 +45,13 @@ interface RuntimeResources { documentExtraction: DocumentTextExtractionService } +export class OcrRuntimeBusyError extends Error { + constructor() { + super('OCR cache cannot be cleared while extraction is active') + this.name = 'OcrRuntimeBusyError' + } +} + /** Lazily owns the offline OCR helper, engine, and derived cache for the application lifetime. */ export class OcrRuntimeService { private readonly resolver: OcrRuntimeAssetResolver @@ -108,7 +115,7 @@ export class OcrRuntimeService { processStatus.state === 'busy' || processStatus.state === 'stopping' ) { - throw new Error('OCR cache cannot be cleared while extraction is active') + throw new OcrRuntimeBusyError() } await resources.store.clear() } diff --git a/src/main/ocr/routes.ts b/src/main/ocr/routes.ts index d1cc6da638..0336d0d1cd 100644 --- a/src/main/ocr/routes.ts +++ b/src/main/ocr/routes.ts @@ -1,6 +1,7 @@ import { ocrClearCacheRoute, ocrGetRuntimeStatusRoute } from '@shared/contracts/routes' -import type { OcrRuntimeStatus } from '@shared/contracts/routes/ocr.routes' +import type { OcrEngine, OcrRuntimeStatus } from '@shared/contracts/routes/ocr.routes' import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' +import type { LightOcrEngineStatus } from './lightOcrProtocol' import type { OcrRuntimeService, OcrRuntimeServiceStatus } from './ocrRuntimeService' export function createOcrRoutes(deps: { @@ -9,7 +10,7 @@ export function createOcrRoutes(deps: { arch?: string }): DeepchatRouteMap { const getStatus = async (): Promise => - toPublicStatus( + toPublicOcrStatus( await deps.runtime.getStatus(), deps.platform ?? process.platform, deps.arch ?? process.arch @@ -36,7 +37,7 @@ export function createOcrRoutes(deps: { ]) } -function toPublicStatus( +export function toPublicOcrStatus( status: OcrRuntimeServiceStatus, platform: string, arch: string @@ -60,24 +61,26 @@ function toPublicStatus( nodeVersion: status.process.nodeVersion, queuedRequests: status.process.queuedRequests, pendingInputBytes: status.process.pendingInputBytes, - engine: status.process.engine - ? { - coreVersion: status.process.engine.coreVersion, - modelBundleId: status.process.engine.modelBundleId, - requestedBackend: status.process.engine.requestedProvider, - strategy: status.process.engine.strategy, - detection: { - providerChain: status.process.engine.detection.actualProviderChain, - precision: status.process.engine.detection.precision - }, - recognition: { - providerChain: status.process.engine.recognition.actualProviderChain, - precision: status.process.engine.recognition.precision - } - } - : null + engine: status.process.engine ? toPublicOcrEngine(status.process.engine) : null } : null, cache: status.cache } } + +export function toPublicOcrEngine(engine: LightOcrEngineStatus): OcrEngine { + return { + coreVersion: engine.coreVersion, + modelBundleId: engine.modelBundleId, + requestedBackend: engine.requestedProvider, + strategy: engine.strategy, + detection: { + providerChain: [...engine.detection.actualProviderChain], + precision: engine.detection.precision + }, + recognition: { + providerChain: [...engine.recognition.actualProviderChain], + precision: engine.recognition.precision + } + } +} diff --git a/src/main/provider/index.ts b/src/main/provider/index.ts index 4926989ecc..6b13053281 100644 --- a/src/main/provider/index.ts +++ b/src/main/provider/index.ts @@ -13,6 +13,7 @@ import type { KeyStatus, LLM_EMBEDDING_ATTRS, StandaloneImageGenerationResult, + StandaloneSpeechGenerationResult, StandaloneVideoGenerationResult, ModelScopeMcpSyncOptions, ModelScopeMcpSyncResult, @@ -29,6 +30,7 @@ import { normalizeVideoGenerationOptions, type VideoGenerationOptions } from '@shared/videoGenerationSettings' +import { normalizeTtsSettings, type TtsSettings } from '@shared/ttsSettings' import { ProviderChange, ProviderBatchUpdate } from '@shared/provider-operations' import { isProviderDbBackedProvider } from '@shared/providerDbCatalog' import type { @@ -762,6 +764,93 @@ export class ProviderRuntime } } + async generateSpeechStandalone( + providerId: string, + text: string, + modelId: string, + speechOptions?: TtsSettings, + options?: { signal?: AbortSignal } + ): Promise { + const normalizedText = text.trim() + if (!normalizedText) { + throw new Error('Speech generation text is required') + } + + const signal = options?.signal + if (signal?.aborted) { + throw createAbortError() + } + + await this.executeWithRateLimit(providerId, { signal }) + + const provider = this.getProviderInstance(providerId) + const modelConfig = this.providerSettings.getModelConfig(modelId, providerId) + const mergedSpeechOptions = normalizeTtsSettings({ + ...modelConfig.tts, + ...speechOptions + }) + const resolvedModelConfig: ModelConfig = { + ...modelConfig, + type: ModelType.TTS, + apiEndpoint: ApiEndpointType.AudioSpeech, + tts: mergedSpeechOptions + } + const stream = provider.coreStream( + [{ role: 'user', content: normalizedText }], + modelId, + resolvedModelConfig, + modelConfig.temperature ?? 0.7, + modelConfig.maxTokens ?? 1024, + [], + { signal } + ) + let audio: StandaloneSpeechGenerationResult['audio'] | undefined + const abort = createAbortPromise(signal, () => { + closeAsyncIterator(stream) + }) + + const collect = async () => { + for await (const event of stream) { + if (signal?.aborted) { + throw createAbortError() + } + + if ( + event.type === 'image_data' && + event.image_data.mimeType.trim().toLowerCase().startsWith('audio/') + ) { + if (audio) { + throw new Error('Speech generation returned multiple audio outputs') + } + audio = { + data: event.image_data.data, + mimeType: event.image_data.mimeType + } + } + if (event.type === 'error') { + throw new Error(event.error_message) + } + } + } + + try { + await (abort.promise ? Promise.race([collect(), abort.promise]) : collect()) + } finally { + abort.cleanup() + } + + if (!audio) { + throw new Error('Speech generation completed without audio output') + } + + return { + providerId, + modelId, + ...(mergedSpeechOptions ? { options: mergedSpeechOptions } : {}), + audio + } + } + // 配置相关方法 setMaxConcurrentStreams(max: number): void { this.config.maxConcurrentStreams = max diff --git a/src/main/provider/routes.ts b/src/main/provider/routes.ts index d6f550d06e..7a437277d6 100644 --- a/src/main/provider/routes.ts +++ b/src/main/provider/routes.ts @@ -64,10 +64,15 @@ import { providersWarmupAcpProcessRoute, type SettingsActivityInput } from '@shared/contracts/routes' -import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' +import { + createRouteMap, + requireRendererCaller, + type DeepchatRouteMap +} from '@/routes/routeRegistry' import type { ProviderImportService } from './providerImportService' import { ProviderService, type ProviderQueryScheduler } from './providerService' import type { ProviderRuntime } from '.' +import { CliRequestError } from '@/cli/errors' export function createProviderRoutes(deps: { providerSettings: ProviderSettingsPort @@ -291,8 +296,19 @@ export function createProviderRoutes(deps: { ], [ providersRemoveRoute.name, - async (rawInput) => { + async (rawInput, context) => { const input = providersRemoveRoute.input.parse(rawInput) + if (context.caller.kind === 'cli') { + const provider = providerSettings.getProviderById(input.providerId) + if (!provider) { + throw new CliRequestError('not_found', 'Provider was not found', { httpStatus: 404 }) + } + if (provider.custom !== true) { + throw new CliRequestError('conflict', 'Built-in providers cannot be removed', { + httpStatus: 409 + }) + } + } providerRuntime.removeProviderAtomic(input.providerId) const result = providersRemoveRoute.output.parse({ removed: true }) recordActivity({ @@ -369,10 +385,11 @@ export function createProviderRoutes(deps: { providersRunAcpDebugActionRoute.name, async (rawInput, context) => { const input = providersRunAcpDebugActionRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return providersRunAcpDebugActionRoute.output.parse({ result: await acpProviderAdminPort.runAcpDebugAction({ ...input, - webContentsId: context.webContentsId + webContentsId: caller.webContentsId }) }) } @@ -529,8 +546,14 @@ export function createProviderRoutes(deps: { ], [ modelsSetStatusRoute.name, - async (rawInput) => { + async (rawInput, context) => { const input = modelsSetStatusRoute.input.parse(rawInput) + if ( + context.caller.kind === 'cli' && + !providerSettings.isKnownModel(input.providerId, input.modelId) + ) { + throw new CliRequestError('not_found', 'Model was not found', { httpStatus: 404 }) + } await providerRuntime.updateModelStatus(input.providerId, input.modelId, input.enabled) const result = modelsSetStatusRoute.output.parse(input) recordActivity({ diff --git a/src/main/routes/index.ts b/src/main/routes/index.ts index 0f4bade2e7..d701f5266f 100644 --- a/src/main/routes/index.ts +++ b/src/main/routes/index.ts @@ -14,7 +14,12 @@ import { sessionsListLightweightRoute, skillsListMetadataRoute } from '@shared/contracts/routes' -import { createRouteRegistry, type DeepchatRouteMap, type RouteContext } from './routeRegistry' +import { + createRendererRouteContext, + createRouteRegistry, + type DeepchatRouteMap, + type RouteContext +} from './routeRegistry' import type { StartupWorkloadCoordinator } from '@/app/startupWorkloadCoordinator' export type RouteDispatcher = { @@ -61,10 +66,10 @@ type StartupTrackedRouteTask = { } function isSettingsWindowContext(dispatcher: RouteDispatcher, context: RouteContext): boolean { - if (context.windowId == null) { + if (context.caller.kind !== 'renderer' || context.caller.windowId == null) { return false } - return dispatcher.settingsWindow.getSettingsWindowId() === context.windowId + return dispatcher.settingsWindow.getSettingsWindowId() === context.caller.windowId } function resolveTrackedRouteTask( @@ -219,10 +224,15 @@ export function registerDeepchatRoutes(ipcMain: IpcMain, dispatcher: RouteDispat ipcMain.handle( DEEPCHAT_ROUTE_INVOKE_CHANNEL, async (event: IpcMainInvokeEvent, routeName: string, rawInput: unknown) => { - return await dispatchDeepchatRoute(dispatcher, routeName, rawInput, { - webContentsId: event.sender.id, - windowId: BrowserWindow.fromWebContents(event.sender)?.id ?? null - }) + return await dispatchDeepchatRoute( + dispatcher, + routeName, + rawInput, + createRendererRouteContext( + event.sender.id, + BrowserWindow.fromWebContents(event.sender)?.id ?? null + ) + ) } ) } diff --git a/src/main/routes/routeRegistry.ts b/src/main/routes/routeRegistry.ts index e995ead453..495dec0146 100644 --- a/src/main/routes/routeRegistry.ts +++ b/src/main/routes/routeRegistry.ts @@ -1,8 +1,67 @@ import type { DeepchatRouteName } from '@shared/contracts/routes' +import type { LocalControlScope } from '@shared/contracts/localControl' -export type RouteContext = { +export type RendererRouteCaller = Readonly<{ + kind: 'renderer' webContentsId: number windowId: number | null +}> + +export type HumanCliRouteCaller = Readonly<{ + kind: 'cli' + principal: 'human' + connectionId: string + scopes: readonly LocalControlScope[] +}> + +export type AgentCliRouteCaller = Readonly<{ + kind: 'cli' + principal: 'agent' + connectionId: string + tokenId: string + scopes: readonly LocalControlScope[] + conversationId: string + expiresAt: number +}> + +export type CliRouteCaller = HumanCliRouteCaller | AgentCliRouteCaller + +export type InternalRouteCaller = Readonly<{ + kind: 'internal' + component: 'scheduler' | 'migration' | 'agent-cli' +}> + +export type RouteCaller = RendererRouteCaller | CliRouteCaller | InternalRouteCaller + +export type RouteContext = Readonly<{ + caller: RouteCaller +}> + +export function createRendererRouteCaller( + webContentsId: number, + windowId: number | null +): RendererRouteCaller { + return { + kind: 'renderer', + webContentsId, + windowId + } +} + +export function createRendererRouteContext( + webContentsId: number, + windowId: number | null +): RouteContext { + return { + caller: createRendererRouteCaller(webContentsId, windowId) + } +} + +export function requireRendererCaller(context: RouteContext): RendererRouteCaller { + if (context.caller.kind !== 'renderer') { + throw new Error('Route requires a renderer caller') + } + return context.caller } export type DeepchatRouteHandler = (rawInput: unknown, context: RouteContext) => Promise diff --git a/src/main/session/data/tables/deepchatSessionMetadata.ts b/src/main/session/data/tables/deepchatSessionMetadata.ts index c7741613f6..2d90bdbc6a 100644 --- a/src/main/session/data/tables/deepchatSessionMetadata.ts +++ b/src/main/session/data/tables/deepchatSessionMetadata.ts @@ -84,6 +84,9 @@ export class DeepChatSessionMetadataTable extends BaseTable { scheduledAt: parsed.scheduledAt } } + if (row.source === 'cli_run' && parsed.source === 'cli_run') { + return { source: 'cli_run' } + } } catch { return null } diff --git a/src/main/session/routes.ts b/src/main/session/routes.ts index c0a3c6ebef..d29c11656b 100644 --- a/src/main/session/routes.ts +++ b/src/main/session/routes.ts @@ -61,7 +61,11 @@ import type { SessionPermissionPort } from '@/session/contracts' import type { UsageStatsService } from '@/session/usageStatsService' import type { AgentSessionExportService } from '@/exporter/agentSessionExporter' import { listAvailableAgents } from '@/agent/shared/availableAgentCatalog' -import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' +import { + createRouteMap, + requireRendererCaller, + type DeepchatRouteMap +} from '@/routes/routeRegistry' import type { Scheduler } from '@/routes/scheduler' import type { SessionAgentAssignmentPort, SessionLifecyclePort, SessionTurnPort } from './contracts' import type { SessionQuery } from './query' @@ -139,14 +143,15 @@ export function createSessionRoutes(deps: { sessionsCreateRoute.name, async (rawInput, context) => { const input = sessionsCreateRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) const { submissionId, ...createInput } = input const created = await withSubmissionCancellation( - context.webContentsId, + caller.webContentsId, submissionId, async (signal) => signal - ? await sessionService.createSession(createInput, context, { signal }) - : await sessionService.createSession(createInput, context) + ? await sessionService.createSession(createInput, caller, { signal }) + : await sessionService.createSession(createInput, caller) ) const { initialTurn, ...session } = created return sessionsCreateRoute.output.parse({ @@ -206,7 +211,7 @@ export function createSessionRoutes(deps: { sessionsActivateRoute.name, async (rawInput, context) => { const input = sessionsActivateRoute.input.parse(rawInput) - await sessionService.activateSession(context, input.sessionId) + await sessionService.activateSession(requireRendererCaller(context), input.sessionId) return sessionsActivateRoute.output.parse({ activated: true }) } ], @@ -214,7 +219,7 @@ export function createSessionRoutes(deps: { sessionsDeactivateRoute.name, async (rawInput, context) => { sessionsDeactivateRoute.input.parse(rawInput) - await sessionService.deactivateSession(context) + await sessionService.deactivateSession(requireRendererCaller(context)) return sessionsDeactivateRoute.output.parse({ deactivated: true }) } ], @@ -223,7 +228,7 @@ export function createSessionRoutes(deps: { async (rawInput, context) => { sessionsGetActiveRoute.input.parse(rawInput) return sessionsGetActiveRoute.output.parse({ - session: await sessionService.getActiveSession(context) + session: await sessionService.getActiveSession(requireRendererCaller(context)) }) } ], @@ -646,9 +651,10 @@ export function createSessionRoutes(deps: { chatSendMessageRoute.name, async (rawInput, context) => { const input = chatSendMessageRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return chatSendMessageRoute.output.parse( await withSubmissionCancellation( - context.webContentsId, + caller.webContentsId, input.submissionId, async (signal) => signal @@ -662,9 +668,10 @@ export function createSessionRoutes(deps: { chatSteerActiveTurnRoute.name, async (rawInput, context) => { const input = chatSteerActiveTurnRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return chatSteerActiveTurnRoute.output.parse( await withSubmissionCancellation( - context.webContentsId, + caller.webContentsId, input.submissionId, async (signal) => signal @@ -678,8 +685,9 @@ export function createSessionRoutes(deps: { chatCancelSubmissionRoute.name, async (rawInput, context) => { const input = chatCancelSubmissionRoute.input.parse(rawInput) + const caller = requireRendererCaller(context) return chatCancelSubmissionRoute.output.parse({ - cancelled: submissionCancellations.cancel(context.webContentsId, input.submissionId) + cancelled: submissionCancellations.cancel(caller.webContentsId, input.submissionId) }) } ], diff --git a/src/main/session/sessionService.ts b/src/main/session/sessionService.ts index b8b54d708a..c92a1a9f78 100644 --- a/src/main/session/sessionService.ts +++ b/src/main/session/sessionService.ts @@ -6,15 +6,13 @@ import type { SessionWithState } from '@shared/types/agent-interface' import type { Scheduler } from '@/routes/scheduler' +import type { RendererRouteCaller } from '@/routes/routeRegistry' const SESSION_OPERATION_TIMEOUT_MS = 5_000 const SESSION_LIST_TIMEOUT_MS = 15_000 const DEFAULT_RESTORE_MESSAGE_LIMIT = 100 -export type SessionRouteContext = { - webContentsId: number - windowId: number | null -} +export type SessionRouteContext = RendererRouteCaller export type SessionListFilters = { agentId?: string diff --git a/src/main/skill/archive.ts b/src/main/skill/archive.ts new file mode 100644 index 0000000000..025eb9b38d --- /dev/null +++ b/src/main/skill/archive.ts @@ -0,0 +1,253 @@ +import fs from 'node:fs' +import path from 'node:path' +import { Unzip, UnzipInflate } from 'fflate' + +export type SkillArchiveLimits = Readonly<{ + maxArchiveBytes: number + maxEntries: number + maxEntryBytes: number + maxExtractedBytes: number + maxCompressionRatio: number + compressionRatioExemptBytes: number + maxPathDepth: number + maxPathCharacters: number +}> + +export const DEFAULT_SKILL_ARCHIVE_LIMITS: SkillArchiveLimits = { + maxArchiveBytes: 200 * 1024 * 1024, + maxEntries: 4096, + maxEntryBytes: 64 * 1024 * 1024, + maxExtractedBytes: 256 * 1024 * 1024, + maxCompressionRatio: 200, + compressionRatioExemptBytes: 1024 * 1024, + maxPathDepth: 32, + maxPathCharacters: 1024 +} + +type ResolvedArchiveEntry = Readonly<{ + destination: string + key: string + isDirectory: boolean +}> + +const WINDOWS_RESERVED_SEGMENT = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i + +function requireBoundedSize(value: number | undefined, label: string): number | undefined { + if (value === undefined) return undefined + if (!Number.isSafeInteger(value) || value < 0) { + throw new Error(`${label} has an invalid size`) + } + return value +} + +function resolveArchiveEntry( + entryName: string, + targetDir: string, + limits: SkillArchiveLimits +): ResolvedArchiveEntry { + if (entryName.includes('\0') || entryName.length > limits.maxPathCharacters) { + throw new Error('ZIP entry has an invalid path') + } + + const normalizedEntry = entryName.replace(/\\/g, '/') + if (!normalizedEntry) throw new Error('ZIP entry has an invalid path') + if (/^[A-Za-z]:/.test(normalizedEntry) || normalizedEntry.startsWith('/')) { + throw new Error('ZIP entry has an invalid path') + } + + const segments: string[] = [] + for (const segment of normalizedEntry.split('/')) { + if (!segment || segment === '.') continue + if (segment === '..') throw new Error('ZIP entry has an invalid path') + if ( + segment.includes(':') || + segment.endsWith('.') || + segment.endsWith(' ') || + WINDOWS_RESERVED_SEGMENT.test(segment) + ) { + throw new Error('ZIP entry has a non-portable path') + } + segments.push(segment) + } + if (segments.length === 0) throw new Error('ZIP entry has an invalid path') + if (segments.length > limits.maxPathDepth) { + throw new Error('ZIP entry exceeds the path depth limit') + } + + const destination = path.resolve(targetDir, ...segments) + const relativeToTarget = path.relative(targetDir, destination) + if ( + relativeToTarget === '..' || + relativeToTarget.startsWith(`..${path.sep}`) || + path.isAbsolute(relativeToTarget) + ) { + throw new Error('ZIP entry has an invalid path') + } + + return { + destination, + key: segments.join('/').normalize('NFC').toLocaleLowerCase('en-US'), + isDirectory: normalizedEntry.endsWith('/') + } +} + +function writeAll(fd: number, chunk: Uint8Array): void { + let offset = 0 + while (offset < chunk.byteLength) { + const written = fs.writeSync(fd, chunk, offset, chunk.byteLength - offset) + if (written <= 0) throw new Error('Failed to write extracted ZIP entry') + offset += written + } +} + +export async function extractSkillArchive( + archivePath: string, + targetDir: string, + limitOverrides: Partial = {} +): Promise { + const limits = { ...DEFAULT_SKILL_ARCHIVE_LIMITS, ...limitOverrides } + const archiveStats = await fs.promises.stat(archivePath) + if (!archiveStats.isFile()) throw new Error('Skill ZIP input is not a file') + if (archiveStats.size > limits.maxArchiveBytes) { + throw new Error( + `ZIP file too large: ${archiveStats.size} bytes (max: ${limits.maxArchiveBytes})` + ) + } + + const resolvedTargetDir = path.resolve(targetDir) + fs.mkdirSync(resolvedTargetDir, { recursive: true }) + + const seenEntries = new Set() + const openFiles = new Set() + let entryCount = 0 + let declaredBytes = 0 + let extractedBytes = 0 + let archiveBytes = 0 + let failure: Error | null = null + + const closeFile = (fd: number): void => { + if (!openFiles.has(fd)) return + fs.closeSync(fd) + openFiles.delete(fd) + } + const fail = (error: unknown, fd?: number): void => { + if (!failure) failure = error instanceof Error ? error : new Error(String(error)) + if (fd !== undefined) { + try { + closeFile(fd) + } catch { + // Preserve the extraction or write failure that caused cleanup. + } + } + } + const unzip = new Unzip((file) => { + if (failure) { + file.ondata = () => undefined + return + } + + try { + entryCount += 1 + if (entryCount > limits.maxEntries) throw new Error('ZIP archive has too many entries') + + const entry = resolveArchiveEntry(file.name, resolvedTargetDir, limits) + const declaredSize = requireBoundedSize(file.originalSize, 'ZIP entry') + const compressedSize = requireBoundedSize(file.size, 'Compressed ZIP entry') + if (declaredSize !== undefined) { + if (declaredSize > limits.maxEntryBytes) { + throw new Error('ZIP entry exceeds the extracted size limit') + } + declaredBytes += declaredSize + if (declaredBytes > limits.maxExtractedBytes) { + throw new Error('ZIP archive exceeds the total extracted size limit') + } + if ( + compressedSize !== undefined && + declaredSize > limits.compressionRatioExemptBytes && + (compressedSize === 0 || declaredSize / compressedSize > limits.maxCompressionRatio) + ) { + throw new Error('ZIP entry exceeds the compression ratio limit') + } + } + + if (seenEntries.has(entry.key)) throw new Error('ZIP archive contains duplicate paths') + seenEntries.add(entry.key) + + if (entry.isDirectory) { + fs.mkdirSync(entry.destination, { recursive: true }) + file.ondata = (error, chunk) => { + if (error) fail(error) + if (chunk?.byteLength) fail(new Error('ZIP directory entry contains file data')) + } + file.start() + return + } + + fs.mkdirSync(path.dirname(entry.destination), { recursive: true }) + const fd = fs.openSync(entry.destination, 'wx') + openFiles.add(fd) + let entryBytes = 0 + file.ondata = (error, chunk, final) => { + if (error) { + fail(error, fd) + return + } + if (failure) { + if (final) { + try { + closeFile(fd) + } catch { + // Preserve the first extraction failure. + } + } + return + } + + try { + if (chunk?.byteLength) { + entryBytes += chunk.byteLength + extractedBytes += chunk.byteLength + if (entryBytes > limits.maxEntryBytes) { + throw new Error('ZIP entry exceeds the extracted size limit') + } + if (extractedBytes > limits.maxExtractedBytes) { + throw new Error('ZIP archive exceeds the total extracted size limit') + } + writeAll(fd, chunk) + } + if (final) closeFile(fd) + } catch (writeError) { + fail(writeError, fd) + } + } + file.start() + } catch (error) { + fail(error) + } + }) + unzip.register(UnzipInflate) + + const archiveStream = fs.createReadStream(archivePath, { highWaterMark: 64 * 1024 }) + try { + for await (const chunk of archiveStream) { + archiveBytes += chunk.byteLength + if (archiveBytes > limits.maxArchiveBytes) { + throw new Error(`ZIP file exceeds its ${limits.maxArchiveBytes} byte limit`) + } + unzip.push(chunk, false) + if (failure) throw failure + } + unzip.push(new Uint8Array(0), true) + if (failure) throw failure + if (openFiles.size > 0) throw new Error('ZIP archive ended before an entry was complete') + } finally { + archiveStream.destroy() + for (const fd of openFiles) { + try { + closeFile(fd) + } catch { + // The original extraction error remains the actionable failure. + } + } + } +} diff --git a/src/main/skill/archiveDownload.ts b/src/main/skill/archiveDownload.ts new file mode 100644 index 0000000000..69b1883bb7 --- /dev/null +++ b/src/main/skill/archiveDownload.ts @@ -0,0 +1,184 @@ +import { open, unlink, type FileHandle } from 'node:fs/promises' + +const DEFAULT_MAX_REDIRECTS = 5 +const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]) +const ZIP_MEDIA_TYPES = new Set([ + 'application/octet-stream', + 'application/x-zip', + 'application/x-zip-compressed', + 'application/zip' +]) + +export type SkillArchiveDownloadOptions = Readonly<{ + maxBytes: number + timeoutMs: number + maxRedirects?: number + fetchImpl?: typeof fetch +}> + +function positiveInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value <= 0) throw new Error(`${name} must be positive`) + return value +} + +function nonnegativeInteger(value: number, name: string): number { + if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${name} must be nonnegative`) + return value +} + +function parseHttpUrl(value: string): URL { + let url: URL + try { + url = new URL(value) + } catch { + throw new Error('Skill archive URL is invalid') + } + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new Error('Skill archive URL must use HTTP or HTTPS') + } + if (url.username || url.password) { + throw new Error('Skill archive URL must not contain credentials') + } + return url +} + +async function removePartialFile(filePath: string): Promise { + try { + await unlink(filePath) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } +} + +async function writeAll(handle: FileHandle, bytes: Buffer, position: number): Promise { + let offset = 0 + while (offset < bytes.length) { + const { bytesWritten } = await handle.write( + bytes, + offset, + bytes.length - offset, + position + offset + ) + if (bytesWritten === 0) throw new Error('Failed to persist Skill archive download') + offset += bytesWritten + } + return position + bytes.length +} + +function declaredContentLength(response: Response, maxBytes: number): number | null { + const raw = response.headers.get('content-length') + if (raw === null) return null + if (!/^(0|[1-9][0-9]*)$/.test(raw)) { + throw new Error('Skill archive Content-Length is invalid') + } + const value = Number(raw) + if (!Number.isSafeInteger(value)) { + throw new Error('Skill archive Content-Length is too large') + } + if (value > maxBytes) { + throw new Error(`Skill archive exceeds the ${maxBytes}-byte download limit`) + } + return value +} + +function assertZipMediaType(response: Response): void { + const raw = response.headers.get('content-type') + if (!raw) return + const mediaType = raw.split(';', 1)[0].trim().toLowerCase() + if (!ZIP_MEDIA_TYPES.has(mediaType)) { + throw new Error('Skill archive response is not a ZIP payload') + } +} + +async function fetchWithSafeRedirects( + initialUrl: URL, + fetchImpl: typeof fetch, + signal: AbortSignal, + maxRedirects: number +): Promise { + let currentUrl = initialUrl + for (let redirectCount = 0; ; redirectCount += 1) { + const response = await fetchImpl(currentUrl, { redirect: 'manual', signal }) + if (!REDIRECT_STATUSES.has(response.status)) return response + if (redirectCount >= maxRedirects) { + await response.body?.cancel().catch(() => undefined) + throw new Error('Skill archive download exceeded the redirect limit') + } + const location = response.headers.get('location') + if (!location) { + await response.body?.cancel().catch(() => undefined) + throw new Error('Skill archive redirect has no destination') + } + const nextUrl = parseHttpUrl(new URL(location, currentUrl).toString()) + if (currentUrl.protocol === 'https:' && nextUrl.protocol !== 'https:') { + await response.body?.cancel().catch(() => undefined) + throw new Error('Skill archive download refused an HTTPS downgrade') + } + await response.body?.cancel().catch(() => undefined) + currentUrl = nextUrl + } +} + +export async function downloadSkillArchive( + url: string, + destinationPath: string, + options: SkillArchiveDownloadOptions +): Promise { + const maxBytes = positiveInteger(options.maxBytes, 'maxBytes') + const timeoutMs = positiveInteger(options.timeoutMs, 'timeoutMs') + const maxRedirects = nonnegativeInteger( + options.maxRedirects ?? DEFAULT_MAX_REDIRECTS, + 'maxRedirects' + ) + const fetchImpl = options.fetchImpl ?? fetch + const controller = new AbortController() + const timeout = setTimeout(() => controller.abort(), timeoutMs) + timeout.unref() + let handle: FileHandle | undefined + let completed = false + let response: Response | undefined + + try { + response = await fetchWithSafeRedirects( + parseHttpUrl(url), + fetchImpl, + controller.signal, + maxRedirects + ) + if (!response.ok) { + throw new Error(`Skill archive download failed with HTTP ${response.status}`) + } + assertZipMediaType(response) + const expectedBytes = declaredContentLength(response, maxBytes) + if (!response.body) throw new Error('Skill archive response has no body') + + handle = await open(destinationPath, 'wx', 0o600) + let size = 0 + let position = 0 + for await (const rawChunk of response.body) { + const chunk = Buffer.from(rawChunk) + size += chunk.length + if (size > maxBytes) { + throw new Error(`Skill archive exceeds the ${maxBytes}-byte download limit`) + } + position = await writeAll(handle, chunk, position) + } + if (size === 0) throw new Error('Skill archive download is empty') + const contentEncoding = response.headers.get('content-encoding')?.trim().toLowerCase() + if ( + expectedBytes !== null && + (!contentEncoding || contentEncoding === 'identity') && + size !== expectedBytes + ) { + throw new Error('Skill archive body length does not match Content-Length') + } + await handle.close() + handle = undefined + completed = true + } finally { + clearTimeout(timeout) + await handle?.close().catch(() => undefined) + if (!completed) await response?.body?.cancel().catch(() => undefined) + if (!completed) await removePartialFile(destinationPath) + } +} diff --git a/src/main/skill/index.ts b/src/main/skill/index.ts index 077ccbce9a..6241f139d5 100644 --- a/src/main/skill/index.ts +++ b/src/main/skill/index.ts @@ -5,8 +5,9 @@ import { execFile } from 'node:child_process' import { randomUUID } from 'node:crypto' import { promisify } from 'node:util' import matter from 'gray-matter' -import { unzipSync } from 'fflate' import type { SkillSettingsPort } from './settings' +import { extractSkillArchive } from './archive' +import { downloadSkillArchive } from './archiveDownload' import { createWatcherRequestId, type IFileWatcherService, @@ -42,7 +43,8 @@ import { SkillScriptDescriptor, SkillScriptRuntime, SkillViewResult, - SkillLinkedFile + SkillLinkedFile, + SKILL_ARCHIVE_MAX_INPUT_BYTES } from '@shared/types/skill' import type { AgentSkillManagementState, @@ -65,6 +67,7 @@ import { } from './agentSkillRoots' const execFileAsync = promisify(execFile) +const READ_ONLY_BUNDLED_SKILL_NAMES = new Set(['deepchat-cli']) /** * Skill system configuration constants @@ -73,8 +76,8 @@ export const SKILL_CONFIG = { /** Maximum size for SKILL.md file (bytes) - prevents memory exhaustion */ SKILL_FILE_MAX_SIZE: 5 * 1024 * 1024, // 5MB - /** Maximum size for ZIP file (bytes) - prevents ZIP bomb attacks */ - ZIP_MAX_SIZE: 200 * 1024 * 1024, // 200MB + /** Maximum compressed ZIP input size (bytes) */ + ZIP_MAX_SIZE: SKILL_ARCHIVE_MAX_INPUT_BYTES, /** Download timeout (milliseconds) - prevents hanging connections */ DOWNLOAD_TIMEOUT: 30 * 1000, // 30 seconds @@ -269,6 +272,7 @@ export class SkillService implements SkillServicePort { private draftsRoot: string private metadataCache: Map = new Map() private contentCache: Map = new Map() + private readOnlyBundledSkills: SkillMetadata[] = [] private scopedCatalogs: Map = new Map() private deletedAgentScopes: Set = new Set() private activeAgentScopeOperations: Map = new Map() @@ -598,6 +602,7 @@ export class SkillService implements SkillServicePort { for (const metadata of [ ...discoveredSkills, + ...this.readOnlyBundledSkills, ...(await this.discoverPluginSkillsOnMainThread()) ]) { if (this.metadataCache.has(metadata.name)) { @@ -911,6 +916,7 @@ export class SkillService implements SkillServicePort { for (const metadata of [ ...discoveredSkills, + ...this.readOnlyBundledSkills, ...(await this.discoverPluginSkillsOnMainThread()) ]) { if (!discoveredByName.has(metadata.name)) { @@ -991,6 +997,22 @@ export class SkillService implements SkillServicePort { return discovered } + private async discoverReadOnlyBundledSkills(): Promise { + const builtinDir = this.resolveBuiltinSkillsDir() + if (!builtinDir) return [] + + const discovered: SkillMetadata[] = [] + for (const name of READ_ONLY_BUNDLED_SKILL_NAMES) { + const skillPath = path.join(builtinDir, name, 'SKILL.md') + if (!(await this.pathExists(skillPath))) continue + const metadata = await this.parseSkillMetadata(skillPath, name, undefined, builtinDir) + if (metadata && this.supportsCurrentPlatform(metadata.platforms)) { + discovered.push({ ...metadata, readOnly: true }) + } + } + return discovered + } + /** * Parse SKILL.md frontmatter to extract metadata */ @@ -1374,12 +1396,12 @@ export class SkillService implements SkillServicePort { return { ...skill, agentId: normalizedAgentId, - canonicalPath: item.canonicalPath || skill.skillRoot, - sourceType: item.source.type, + canonicalPath: skill.readOnly ? skill.skillRoot : item.canonicalPath || skill.skillRoot, + sourceType: skill.readOnly ? 'builtin' : item.source.type, disabled: item.disabled, deepchatDisabled: item.disabled, agentLinks: item.agentLinks ?? {}, - mutable: !skill.ownerPluginId + mutable: !skill.ownerPluginId && !skill.readOnly } }) } @@ -2026,12 +2048,14 @@ export class SkillService implements SkillServicePort { async installBuiltinSkills(): Promise { const builtinDir = this.resolveBuiltinSkillsDir() if (!builtinDir || !fs.existsSync(builtinDir)) { + this.readOnlyBundledSkills = [] return } const entries = fs.readdirSync(builtinDir, { withFileTypes: true }) for (const entry of entries) { if (!entry.isDirectory()) continue + if (READ_ONLY_BUNDLED_SKILL_NAMES.has(entry.name)) continue const skillDir = path.join(builtinDir, entry.name) const skillMdPath = path.join(skillDir, 'SKILL.md') if (!fs.existsSync(skillMdPath)) continue @@ -2052,6 +2076,7 @@ export class SkillService implements SkillServicePort { console.warn('[SkillService] Failed to install builtin skill:', result.error) } } + this.readOnlyBundledSkills = await this.discoverReadOnlyBundledSkills() } private supportsCurrentPlatform(platforms?: string[]): boolean { @@ -2173,7 +2198,9 @@ export class SkillService implements SkillServicePort { const tempDir = fs.mkdtempSync(path.join(app.getPath('temp'), 'deepchat-skill-')) try { - this.extractZipToDirectory(zipPath, tempDir) + await extractSkillArchive(zipPath, tempDir, { + maxArchiveBytes: SKILL_CONFIG.ZIP_MAX_SIZE + }) const skillDir = this.resolveSkillDirFromExtracted(tempDir) if (!skillDir) { return { success: false, error: 'SKILL.md not found in zip archive' } @@ -2205,9 +2232,12 @@ export class SkillService implements SkillServicePort { ): Promise { const normalizedAgentId = await this.requireAgentScope(agentId) const finishOperation = this.beginAgentScopeOperation(normalizedAgentId) - const tempZipPath = path.join(app.getPath('temp'), `deepchat-skill-${Date.now()}.zip`) + const tempZipPath = path.join(app.getPath('temp'), `deepchat-skill-${randomUUID()}.zip`) try { - await this.downloadSkillZip(url, tempZipPath) + await downloadSkillArchive(url, tempZipPath, { + maxBytes: SKILL_CONFIG.ZIP_MAX_SIZE, + timeoutMs: SKILL_CONFIG.DOWNLOAD_TIMEOUT + }) const result = await this.installFromZipForAgent(normalizedAgentId, tempZipPath, options) if (result.success && result.skillName) { this.updateSkillManagementItem( @@ -3025,65 +3055,6 @@ export class SkillService implements SkillServicePort { return code === 'EPERM' || code === 'EBUSY' || code === 'EACCES' || code === 'ENOTEMPTY' } - private extractZipToDirectory(zipPath: string, targetDir: string): void { - // Check ZIP file size before loading to prevent memory exhaustion - const stats = fs.statSync(zipPath) - if (stats.size > SKILL_CONFIG.ZIP_MAX_SIZE) { - throw new Error(`ZIP file too large: ${stats.size} bytes (max: ${SKILL_CONFIG.ZIP_MAX_SIZE})`) - } - - const zipContent = new Uint8Array(fs.readFileSync(zipPath)) - const extracted = unzipSync(zipContent) - const resolvedTargetDir = path.resolve(targetDir) - - for (const entryName of Object.keys(extracted)) { - const fileContent = extracted[entryName] - if (!fileContent) { - continue - } - - const normalizedEntry = entryName.replace(/\\/g, '/') - if (!normalizedEntry) { - continue - } - - if (/^[A-Za-z]:/.test(normalizedEntry) || normalizedEntry.startsWith('/')) { - throw new Error('Invalid zip entry') - } - - const segments = normalizedEntry.split('/') - const safeSegments: string[] = [] - for (const segment of segments) { - if (!segment || segment === '.') { - continue - } - if (segment === '..') { - throw new Error('Invalid zip entry') - } - safeSegments.push(segment) - } - - if (safeSegments.length === 0) { - continue - } - - const isDirectoryEntry = normalizedEntry.endsWith('/') - const destination = path.resolve(resolvedTargetDir, ...safeSegments) - const relativeToTarget = path.relative(resolvedTargetDir, destination) - if (relativeToTarget.startsWith('..') || path.isAbsolute(relativeToTarget)) { - throw new Error('Invalid zip entry') - } - - if (isDirectoryEntry) { - fs.mkdirSync(destination, { recursive: true }) - continue - } - - fs.mkdirSync(path.dirname(destination), { recursive: true }) - fs.writeFileSync(destination, Buffer.from(fileContent)) - } - } - private resolveSkillDirFromExtracted(extractDir: string): string | null { const rootSkill = path.join(extractDir, 'SKILL.md') if (fs.existsSync(rootSkill)) { @@ -3104,50 +3075,6 @@ export class SkillService implements SkillServicePort { return null } - private async downloadSkillZip(url: string, destPath: string): Promise { - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), SKILL_CONFIG.DOWNLOAD_TIMEOUT) - - try { - const response = await fetch(url, { signal: controller.signal }) - if (!response.ok) { - throw new Error(`Failed to download skill zip: ${response.status} ${response.statusText}`) - } - - // Check Content-Length to prevent memory exhaustion - const contentLength = response.headers.get('content-length') - if (contentLength && parseInt(contentLength) > SKILL_CONFIG.ZIP_MAX_SIZE) { - throw new Error( - `File too large: ${contentLength} bytes (max: ${SKILL_CONFIG.ZIP_MAX_SIZE})` - ) - } - - // Validate Content-Type - const contentType = response.headers.get('content-type') - if ( - contentType && - !contentType.includes('application/zip') && - !contentType.includes('application/octet-stream') && - !contentType.includes('application/x-zip') - ) { - throw new Error(`Expected ZIP file but got: ${contentType}`) - } - - const buffer = new Uint8Array(await response.arrayBuffer()) - - // Double-check actual size after download - if (buffer.length > SKILL_CONFIG.ZIP_MAX_SIZE) { - throw new Error( - `Downloaded file too large: ${buffer.length} bytes (max: ${SKILL_CONFIG.ZIP_MAX_SIZE})` - ) - } - - fs.writeFileSync(destPath, Buffer.from(buffer)) - } finally { - clearTimeout(timeoutId) - } - } - private async cloneGitSkillRepo(repoUrl: string): Promise { const operationRoot = path.join(app.getPath('home'), '.deepchat', 'tmp', 'skill-installs') fs.mkdirSync(operationRoot, { recursive: true }) @@ -3554,6 +3481,8 @@ export class SkillService implements SkillServicePort { } this.cleanupUninstalledSkillState(name, normalizedAgentId) + const bundledFallback = this.readOnlyBundledSkills.find((skill) => skill.name === name) + if (bundledFallback) metadataCache.set(name, bundledFallback) this.publishEvent('skills.catalog.changed', { reason: 'uninstalled', @@ -3650,6 +3579,9 @@ export class SkillService implements SkillServicePort { } private assertMutableSkillOwnership(agentId: string, metadata: SkillMetadata): void { + if (metadata.readOnly) { + throw new Error('Read-only bundled Skills cannot be modified as Agent-owned files') + } if (metadata.ownerPluginId) { throw new Error('Plugin-owned Skills cannot be modified as Agent-owned files') } @@ -4672,6 +4604,7 @@ export class SkillService implements SkillServicePort { await this.stopWatching() this.metadataCache.clear() this.contentCache.clear() + this.readOnlyBundledSkills = [] this.scopedCatalogs.clear() this.deletedAgentScopes.clear() this.activeAgentScopeOperations.clear() diff --git a/src/main/tool/agentTools/agentBashHandler.ts b/src/main/tool/agentTools/agentBashHandler.ts index 9c7c7a6606..2b8f4622ac 100644 --- a/src/main/tool/agentTools/agentBashHandler.ts +++ b/src/main/tool/agentTools/agentBashHandler.ts @@ -14,7 +14,7 @@ import { RTK_ENABLED_SETTING_KEY, rtkRuntimeService } from '@/agent/shared/process/rtkRuntimeService' -import { getUserShell } from '@/agent/shared/process/shellEnvHelper' +import { getUserShell, mergeCommandEnvironment } from '@/agent/shared/process/shellEnvHelper' import { createUtf8OutputDecoderPair, prepareShellCommandForUtf8Output @@ -50,6 +50,19 @@ export interface ExecuteCommandOptions { allowExternalCwd?: boolean } +export interface AgentCommandEnvironmentPort { + createEnvironment( + conversationId: string, + command: string + ): + | Readonly<{ + variables: Readonly> + prependPath: readonly string[] + preserveCommand: boolean + }> + | undefined +} + interface PreparedCommand { originalCommand: string command: string @@ -60,6 +73,11 @@ interface PreparedCommand { rtkFallbackReason?: string } +interface ResolvedCommandEnvironment { + env?: Record + preserveCommand: boolean +} + interface CompletedShellProcessResult { kind: 'completed' output: string @@ -84,7 +102,8 @@ export class AgentBashHandler { constructor( allowedDirectories: string[], settings: Pick, - commandPermissionHandler: CommandPermissionService + commandPermissionHandler: CommandPermissionService, + private readonly commandEnvironment?: AgentCommandEnvironmentPort ) { if (allowedDirectories.length === 0) { throw new Error('At least one allowed directory must be provided') @@ -139,7 +158,12 @@ export class AgentBashHandler { let result: ShellProcessResult - const prepared = await this.prepareCommand(command, options.env) + const resolvedEnvironment = this.resolveCommandEnvironment(command, options) + const prepared = await this.prepareCommand( + command, + resolvedEnvironment.env, + resolvedEnvironment.preserveCommand + ) result = await this.runShellProcess( prepared.command, @@ -576,7 +600,12 @@ export class AgentBashHandler { ) } - const prepared = await this.prepareCommand(command, options.env) + const resolvedEnvironment = this.resolveCommandEnvironment(command, options) + const prepared = await this.prepareCommand( + command, + resolvedEnvironment.env, + resolvedEnvironment.preserveCommand + ) const result = await backgroundExecSessionManager.start(conversationId, prepared.command, cwd, { timeout: timeout ?? COMMAND_DEFAULT_TIMEOUT_MS, @@ -603,13 +632,14 @@ export class AgentBashHandler { private async prepareCommand( command: string, - env?: Record + env?: Record, + preserveCommand = false ): Promise { const baseEnv = env ?? {} const prepared = await rtkRuntimeService.prepareShellCommand( command, baseEnv, - this.settings.get(RTK_ENABLED_SETTING_KEY) !== false + !preserveCommand && this.settings.get(RTK_ENABLED_SETTING_KEY) !== false ) return { originalCommand: prepared.originalCommand, @@ -618,7 +648,28 @@ export class AgentBashHandler { rewritten: prepared.rewritten, rtkApplied: prepared.rtkApplied, rtkMode: prepared.rtkMode, - rtkFallbackReason: prepared.rtkFallbackReason + rtkFallbackReason: preserveCommand + ? 'RTK rewrite bypassed for scoped command authority' + : prepared.rtkFallbackReason + } + } + + private resolveCommandEnvironment( + command: string, + options: ExecuteCommandOptions + ): ResolvedCommandEnvironment { + const scopedEnvironment = options.conversationId + ? this.commandEnvironment?.createEnvironment(options.conversationId, command) + : undefined + if (!scopedEnvironment) return { env: options.env, preserveCommand: false } + return { + env: mergeCommandEnvironment({ + processEnv: process.env, + overrides: { ...options.env, ...scopedEnvironment.variables }, + prependPathSources: [...scopedEnvironment.prependPath], + includeDefaultPaths: false + }), + preserveCommand: scopedEnvironment.preserveCommand } } diff --git a/src/main/tool/agentTools/agentToolManager.ts b/src/main/tool/agentTools/agentToolManager.ts index 55057aad78..e2ed01cff5 100644 --- a/src/main/tool/agentTools/agentToolManager.ts +++ b/src/main/tool/agentTools/agentToolManager.ts @@ -14,7 +14,7 @@ import type { ToolCallImagePreview } from '@shared/types/core/mcp' import type { SkillManageResult } from '@shared/types/skill' import { buildBinaryReadGuidance, shouldRejectAgentBinaryRead } from '@/lib/binaryReadGuard' import { AgentFileSystemHandler, type ProtectedDirectoryRule } from './agentFileSystemHandler' -import { AgentBashHandler } from './agentBashHandler' +import { AgentBashHandler, type AgentCommandEnvironmentPort } from './agentBashHandler' import { AgentFffSearchHandler, GLOB_TOOL_NAME, @@ -116,6 +116,7 @@ interface AgentToolManagerOptions { skillSettings: SkillSettingsPort desktopSettings: AgentDisplaySettingsPort commandPermissionHandler: CommandPermissionService + commandEnvironment?: AgentCommandEnvironmentPort dependencies: AgentToolDependencies } @@ -163,6 +164,7 @@ export class AgentToolManager { private readonly agentSettings: Pick private readonly skillSettings: SkillSettingsPort private readonly desktopSettings: AgentDisplaySettingsPort + private readonly commandEnvironment?: AgentCommandEnvironmentPort private readonly dependencies: AgentToolDependencies private skillTools: SkillTools | null = null private skillExecutionService: SkillExecutionService | null = null @@ -338,6 +340,7 @@ export class AgentToolManager { this.skillSettings = options.skillSettings this.desktopSettings = options.desktopSettings this.commandPermissionHandler = options.commandPermissionHandler + this.commandEnvironment = options.commandEnvironment this.dependencies = options.dependencies this.liveDelegationTool = this.dependencies.liveDelegation ? new LiveDelegationAgentTool(this.dependencies.liveDelegation) @@ -363,7 +366,8 @@ export class AgentToolManager { this.bashHandler = new AgentBashHandler( [this.agentWorkspacePath], this.settings, - this.commandPermissionHandler + this.commandPermissionHandler, + this.commandEnvironment ) } } @@ -386,7 +390,8 @@ export class AgentToolManager { this.bashHandler = new AgentBashHandler( [effectiveWorkspacePath], this.settings, - this.commandPermissionHandler + this.commandPermissionHandler, + this.commandEnvironment ) } else { this.fileSystemHandler = null @@ -1045,7 +1050,8 @@ export class AgentToolManager { const bashHandler = new AgentBashHandler( allowedDirectories, this.settings, - this.commandPermissionHandler + this.commandPermissionHandler, + this.commandEnvironment ) const execArgs = parsedArgs as { command: string diff --git a/src/main/tool/index.ts b/src/main/tool/index.ts index 947fdbcaa2..4ebf7ab63f 100644 --- a/src/main/tool/index.ts +++ b/src/main/tool/index.ts @@ -52,6 +52,7 @@ import { YO_BROWSER_TOOL_NAMES } from './browser/definitions' import type { SkillSettingsPort } from '@/skill/settings' import type { AgentSettingsPort } from '@/agent/settings' import type { SettingsStore } from '@/config/settingsStore' +import type { AgentCommandEnvironmentPort } from './agentTools/agentBashHandler' import type { ToolEffectObserver } from './effectObserver' import { resolvePluginToolPolicy } from '@/plugin/toolPolicyStore' import { composeSubagentAuthority } from '@/session/subagentAuthority' @@ -68,6 +69,7 @@ interface ToolServiceOptions { skillSettings: SkillSettingsPort desktopSettings: AgentDisplaySettingsPort commandPermissionHandler: CommandPermissionService + commandEnvironment?: AgentCommandEnvironmentPort permissionBroker?: ToolPermissionBroker liveDelegationConsent?: LiveDelegationConsentIssuer agentTools: AgentToolDependencies @@ -159,6 +161,7 @@ export class ToolService implements ToolServicePort { skillSettings: this.options.skillSettings, desktopSettings: this.options.desktopSettings, commandPermissionHandler: this.options.commandPermissionHandler, + commandEnvironment: this.options.commandEnvironment, dependencies: this.options.agentTools }) } diff --git a/src/main/tool/permission/commandPermissionService.ts b/src/main/tool/permission/commandPermissionService.ts index 40b87a2639..ce183b6f00 100644 --- a/src/main/tool/permission/commandPermissionService.ts +++ b/src/main/tool/permission/commandPermissionService.ts @@ -1,3 +1,4 @@ +import { createHash } from 'node:crypto' import { CommandPermissionCache } from './commandPermissionCache' export type CommandRiskLevel = 'low' | 'medium' | 'high' | 'critical' @@ -40,7 +41,7 @@ const SAFE_COMMANDS = new Set([ const DESTRUCTIVE_PATTERN = /\brm\s+-rf\b|:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;|\bchmod\s+777\s+\// const NETWORK_PATTERN = /\b(curl|wget|nc|netcat|telnet)\b/ -const CHAINING_PATTERN = /&&|\|\||;|\$\(|`|\|/ +const SHELL_CONTROL_CHARS = new Set([';', '|', '&', '<', '>', '\r', '\n']) const RISKY_COMMANDS = /\b(rm|rmdir|mv|chmod|chown|sudo|doas|su|docker|podman|kubectl)\b/ const BUILD_COMMANDS = /\b(git\s+(pull|push|checkout|switch|merge)|npm|pnpm|yarn|bun|pip|pip3|cargo|make|gradle|mvn)\b/ @@ -52,6 +53,53 @@ const SUGGESTION_KEYS: Record = { critical: 'components.messageBlockPermissionRequest.suggestion.critical' } +function hasShellControlSyntax(command: string): boolean { + let quote: "'" | '"' | null = null + const supportsPosixEscapes = process.platform !== 'win32' + + for (let index = 0; index < command.length; index += 1) { + const character = command[index] + + if (quote === "'") { + if (character === "'") quote = null + continue + } + + if (quote === '"') { + if (character === '"') { + quote = null + continue + } + if (supportsPosixEscapes && character === '\\') { + index += 1 + continue + } + if (character === '`' || (character === '$' && command[index + 1] === '(')) { + return true + } + continue + } + + if (supportsPosixEscapes && character === '\\') { + index += 1 + continue + } + if (character === '"' || (supportsPosixEscapes && character === "'")) { + quote = character + continue + } + if ( + character === '`' || + (character === '$' && command[index + 1] === '(') || + SHELL_CONTROL_CHARS.has(character) + ) { + return true + } + } + + return false +} + export class CommandPermissionRequiredError extends Error { readonly permissionRequest: { toolName: string @@ -167,7 +215,7 @@ export class CommandPermissionService { return { level: 'critical', suggestion: SUGGESTION_KEYS.critical } } - if (CHAINING_PATTERN.test(command)) { + if (hasShellControlSyntax(command)) { return { level: 'critical', suggestion: SUGGESTION_KEYS.critical } } @@ -187,6 +235,10 @@ export class CommandPermissionService { return { level: 'medium', suggestion: SUGGESTION_KEYS.medium } } + hasShellControlSyntax(command: string): boolean { + return hasShellControlSyntax(command) + } + extractBaseCommand(command: string): string { const tokens = this.tokenize(command) if (tokens.length === 0) return '' @@ -200,7 +252,13 @@ export class CommandPermissionService { } extractCommandSignature(command: string): string { - const tokens = this.tokenize(command) + const trimmed = command.trim() + if (hasShellControlSyntax(trimmed)) { + const digest = createHash('sha256').update(trimmed).digest('hex') + return `shell:${digest}` + } + + const tokens = this.tokenize(trimmed) if (tokens.length === 0) return '' let index = 0 diff --git a/src/main/tool/permission/index.ts b/src/main/tool/permission/index.ts index 20584d34f0..60504bcf6b 100644 --- a/src/main/tool/permission/index.ts +++ b/src/main/tool/permission/index.ts @@ -4,6 +4,7 @@ export { FilePermissionService, FilePermissionRequiredError } from './filePermis export { SettingsPermissionService } from './settingsPermissionService' export { ToolPermissionBroker, + type ToolPermissionBrokerOptions, type ToolPermissionContext, type ToolPermissionDecision, type ToolPermissionSource diff --git a/src/main/tool/permission/toolPermissionBroker.ts b/src/main/tool/permission/toolPermissionBroker.ts index 9bd1003b43..971271fbf3 100644 --- a/src/main/tool/permission/toolPermissionBroker.ts +++ b/src/main/tool/permission/toolPermissionBroker.ts @@ -1,13 +1,16 @@ import type { PermissionMode } from '@shared/types/agent-interface' import type { ToolPermissionPreCheckResult } from '@shared/types/tool' -import { createHash, randomUUID } from 'node:crypto' +import { + ApprovalBroker, + ApprovalCapacityError, + type ApprovalMatch, + type ApprovalSnapshot +} from '@/approval' -const MAX_ARGUMENT_BYTES = 1024 * 1024 -const MAX_ARGUMENT_PREVIEW_BYTES = 16 * 1024 -const MAX_ARGUMENT_DEPTH = 64 -const MAX_ARGUMENT_KEYS = 10_000 const MAX_PENDING_PER_CONVERSATION = 64 -const DEFAULT_REQUEST_TIMEOUT_MS = 2 * 60 * 1000 +const DEFAULT_REQUEST_TIMEOUT_MS = 2 * 60_000 +const TOOL_APPROVAL_DOMAIN = 'tool-permission' +const TOOL_APPROVAL_OPERATION = 'tool.execute' export type ToolPermissionSource = 'model' | 'mcp-app' @@ -32,8 +35,12 @@ export interface ToolPermissionDecision { reason?: 'denied' | 'cancelled' | 'timeout' } -type PendingPermission = { - requestId: string +export type ToolPermissionBrokerOptions = Readonly<{ + approvalBroker?: ApprovalBroker + timeoutMs?: number +}> + +type ToolApprovalMetadata = Readonly<{ conversationId: string serverId: string configGeneration?: number @@ -41,96 +48,71 @@ type PendingPermission = { serverName: string toolName: string executionId?: string - argumentsHash: string - argumentsPreview: string source: ToolPermissionSource permissionType: 'read' | 'write' approvalMode: 'permission_mode' | 'explicit_user' description?: string - status: 'pending' | 'approved' - expiresAt: number - timeout: NodeJS.Timeout - settlers: Set<(decision: ToolPermissionDecision) => void> - abortCleanups: Set<() => void> -} +}> -type CanonicalizeState = { - keys: number - seen: WeakSet +function toolScopeKey(conversationId: string): string { + return `tool:${conversationId}` } -const canonicalize = (value: unknown, state: CanonicalizeState, depth = 0): unknown => { - if (depth > MAX_ARGUMENT_DEPTH) { - throw new Error('Tool arguments exceed the permission depth limit') - } - if (Array.isArray(value)) { - if (state.seen.has(value)) { - throw new Error('Tool arguments must not contain cycles') - } - state.seen.add(value) - const output = value.map((entry) => canonicalize(entry, state, depth + 1)) - state.seen.delete(value) - return output - } - - if (value && typeof value === 'object') { - if (state.seen.has(value)) { - throw new Error('Tool arguments must not contain cycles') - } - state.seen.add(value) - const output = Object.fromEntries( - Object.entries(value as Record) - .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)) - .map(([key, entry]) => { - state.keys += 1 - if (state.keys > MAX_ARGUMENT_KEYS) { - throw new Error('Tool arguments exceed the permission key limit') - } - return [key, canonicalize(entry, state, depth + 1)] - }) - ) - state.seen.delete(value) - return output - } - +function toolBindingKey(context: ToolPermissionContext): string { if ( - value !== null && - typeof value !== 'string' && - typeof value !== 'number' && - typeof value !== 'boolean' && - value !== undefined + context.configGeneration !== undefined && + (!Number.isSafeInteger(context.configGeneration) || context.configGeneration <= 0) ) { - throw new Error('Tool arguments must be JSON-compatible') + throw new Error('Tool permission config generation must be a positive safe integer') } - if (typeof value === 'number' && !Number.isFinite(value)) { - throw new Error('Tool arguments must contain only finite numbers') - } - return value + return JSON.stringify([ + context.serverId, + context.configGeneration === undefined + ? ['config-generation-absent'] + : ['config-generation-present', context.configGeneration], + context.bindingHash === undefined + ? ['binding-hash-absent'] + : ['binding-hash-present', context.bindingHash], + context.toolName, + context.executionId === undefined + ? ['execution-id-absent'] + : ['execution-id-present', context.executionId], + context.source, + context.permissionType, + context.approvalMode ?? 'permission_mode' + ]) } -const serializeArguments = (value: unknown): { hash: string; preview: string } => { - const serialized = - JSON.stringify(canonicalize(value, { keys: 0, seen: new WeakSet() })) ?? 'null' - const bytes = Buffer.byteLength(serialized, 'utf8') - if (bytes > MAX_ARGUMENT_BYTES) { - throw new Error(`Tool arguments exceed the ${MAX_ARGUMENT_BYTES}-byte permission limit`) - } - - const preview = - bytes <= MAX_ARGUMENT_PREVIEW_BYTES - ? serialized - : `${Buffer.from(serialized).subarray(0, MAX_ARGUMENT_PREVIEW_BYTES).toString('utf8')}…` - +function toMetadata(context: ToolPermissionContext): ToolApprovalMetadata { return { - hash: createHash('sha256').update(serialized).digest('hex'), - preview + conversationId: context.conversationId, + serverId: context.serverId, + configGeneration: context.configGeneration, + bindingHash: context.bindingHash, + serverName: context.serverName, + toolName: context.toolName, + executionId: context.executionId, + source: context.source, + permissionType: context.permissionType, + approvalMode: context.approvalMode ?? 'permission_mode', + description: context.description } } export class ToolPermissionBroker { - private readonly pending = new Map() - - constructor(private readonly timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {} + private readonly approvals: ApprovalBroker + private readonly timeoutMs: number + + constructor(options: number | ToolPermissionBrokerOptions = {}) { + const normalized = typeof options === 'number' ? { timeoutMs: options } : options + this.timeoutMs = normalized.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS + this.approvals = + normalized.approvalBroker ?? + new ApprovalBroker({ + defaultTimeoutMs: this.timeoutMs, + maxPendingPerScope: MAX_PENDING_PER_CONVERSATION + }) + } evaluateModel( context: ToolPermissionContext, @@ -140,8 +122,7 @@ export class ToolPermissionBroker { return null } - const pending = this.createPending(context, signal) - return this.toPermissionRequest(pending) + return this.toPermissionRequest(this.createPending(context, signal)) } authorizeExecution( @@ -157,27 +138,7 @@ export class ToolPermissionBroker { return { allowed: true } } - const { hash } = serializeArguments(context.arguments) - const approved = Array.from(this.pending.values()).find( - (entry) => - entry.status === 'approved' && - entry.conversationId === context.conversationId && - entry.serverId === context.serverId && - entry.configGeneration === context.configGeneration && - entry.bindingHash === context.bindingHash && - entry.toolName === context.toolName && - entry.executionId === context.executionId && - entry.argumentsHash === hash && - entry.source === context.source && - entry.permissionType === context.permissionType && - entry.approvalMode === (context.approvalMode ?? 'permission_mode') - ) - - if (approved) { - this.deletePending(approved.requestId) - return { allowed: true } - } - + if (this.approvals.consumeApproved(this.toMatch(context))) return { allowed: true } const pending = this.createPending(context, signal) return { allowed: false, request: this.toPermissionRequest(pending) } } @@ -192,209 +153,117 @@ export class ToolPermissionBroker { ) { return { allowed: true } } - const pending = this.createPending({ ...context, source: 'mcp-app' }) + const appContext = { ...context, source: 'mcp-app' as const } + const pending = this.createPending(appContext) + const decision = this.approvals.wait(pending.requestId) try { onRequest(this.toPermissionRequest(pending)) } catch { - this.deletePending(pending.requestId) - return { allowed: false, reason: 'denied' } + this.approvals.resolve({ + requestId: pending.requestId, + scopeKey: toolScopeKey(context.conversationId), + decision: 'denied' + }) } - return await new Promise((resolve) => { - pending.settlers.add(resolve) - }) + return await decision } approve(requestId: string, conversationId: string): boolean { - const pending = this.pending.get(requestId) - if ( - !pending || - pending.status !== 'pending' || - pending.conversationId !== conversationId || - pending.expiresAt <= Date.now() - ) { - return false - } - - if (pending.source === 'mcp-app') { - this.settleAppPermission(pending, { allowed: true }) - this.deletePending(requestId) - return true - } - - pending.status = 'approved' - return true + return this.approvals.resolve({ + requestId, + scopeKey: toolScopeKey(conversationId), + decision: 'approved' + }) } deny(requestId: string, conversationId: string): boolean { - return this.resolveDenied(requestId, conversationId, 'denied') + return this.approvals.resolve({ + requestId, + scopeKey: toolScopeKey(conversationId), + decision: 'denied' + }) } cancel(requestId: string, conversationId: string): boolean { - return this.resolveDenied(requestId, conversationId, 'cancelled') + return this.approvals.resolve({ + requestId, + scopeKey: toolScopeKey(conversationId), + decision: 'cancelled' + }) } cancelConversation(conversationId: string): void { - for (const pending of this.pending.values()) { - if (pending.conversationId === conversationId) { - this.settleAppPermission(pending, { allowed: false, reason: 'cancelled' }) - this.deletePending(pending.requestId) - } - } + this.approvals.cancelScope(toolScopeKey(conversationId)) } clear(): void { - for (const pending of this.pending.values()) { - this.settleAppPermission(pending, { allowed: false, reason: 'cancelled' }) - this.deletePending(pending.requestId) - } + this.approvals.clearDomain(TOOL_APPROVAL_DOMAIN) } - private createPending(context: ToolPermissionContext, signal?: AbortSignal): PendingPermission { - signal?.throwIfAborted() - this.pruneExpired() - const { hash, preview } = serializeArguments(context.arguments) - const existing = Array.from(this.pending.values()).find( - (entry) => - entry.status === 'pending' && - entry.conversationId === context.conversationId && - entry.serverId === context.serverId && - entry.configGeneration === context.configGeneration && - entry.bindingHash === context.bindingHash && - entry.toolName === context.toolName && - entry.executionId === context.executionId && - entry.argumentsHash === hash && - entry.source === context.source && - entry.permissionType === context.permissionType && - entry.approvalMode === (context.approvalMode ?? 'permission_mode') - ) - if (existing) { - this.attachAbort(existing, signal) - return existing - } - const conversationPending = Array.from(this.pending.values()).filter( - (entry) => entry.conversationId === context.conversationId - ).length - if (conversationPending >= MAX_PENDING_PER_CONVERSATION) { - throw new Error('Too many pending tool permission requests') - } - - const requestId = randomUUID() - const expiresAt = Date.now() + this.timeoutMs - const pending: PendingPermission = { - requestId, - conversationId: context.conversationId, - serverId: context.serverId, - configGeneration: context.configGeneration, - bindingHash: context.bindingHash, - serverName: context.serverName, - toolName: context.toolName, - executionId: context.executionId, - argumentsHash: hash, - argumentsPreview: preview, - source: context.source, - permissionType: context.permissionType, - approvalMode: context.approvalMode ?? 'permission_mode', - description: context.description, - status: 'pending', - expiresAt, - settlers: new Set(), - abortCleanups: new Set(), - timeout: setTimeout(() => { - const current = this.pending.get(requestId) - if (current) { - this.settleAppPermission(current, { allowed: false, reason: 'timeout' }) + private createPending( + context: ToolPermissionContext, + signal?: AbortSignal + ): ApprovalSnapshot { + try { + return this.approvals.create( + { + domain: TOOL_APPROVAL_DOMAIN, + scopeKey: toolScopeKey(context.conversationId), + operation: TOOL_APPROVAL_OPERATION, + effect: context.permissionType, + bindingKey: toolBindingKey(context), + arguments: context.arguments, + metadata: toMetadata(context) + }, + { + deduplicatePending: true, + includeArgumentsPreview: true, + consumeOnApprove: context.source === 'mcp-app', + timeoutMs: this.timeoutMs, + signal } - this.deletePending(requestId) - }, this.timeoutMs) + ) + } catch (error) { + if (error instanceof ApprovalCapacityError) { + throw new Error('Too many pending tool permission requests') + } + throw error } + } - this.pending.set(requestId, pending) - this.attachAbort(pending, signal) - return pending + private toMatch(context: ToolPermissionContext): ApprovalMatch { + return { + domain: TOOL_APPROVAL_DOMAIN, + scopeKey: toolScopeKey(context.conversationId), + operation: TOOL_APPROVAL_OPERATION, + effect: context.permissionType, + bindingKey: toolBindingKey(context), + arguments: context.arguments + } } - private toPermissionRequest(pending: PendingPermission): ToolPermissionPreCheckResult { + private toPermissionRequest( + pending: ApprovalSnapshot + ): ToolPermissionPreCheckResult { + const metadata = pending.metadata return { needsPermission: true, requestId: pending.requestId, - conversationId: pending.conversationId, - toolName: pending.toolName, - serverName: pending.serverName, - permissionType: pending.permissionType, + conversationId: metadata.conversationId, + toolName: metadata.toolName, + serverName: metadata.serverName, + permissionType: metadata.permissionType, description: - pending.description ?? - `components.messageBlockPermissionRequest.description.${pending.permissionType}`, + metadata.description ?? + `components.messageBlockPermissionRequest.description.${metadata.permissionType}`, rememberable: false, - ...(pending.approvalMode === 'explicit_user' ? { requiresUserConfirmation: true } : {}), - source: pending.source, - serverId: pending.serverId, - configGeneration: pending.configGeneration, - bindingHash: pending.bindingHash, + ...(metadata.approvalMode === 'explicit_user' ? { requiresUserConfirmation: true } : {}), + source: metadata.source, + serverId: metadata.serverId, + configGeneration: metadata.configGeneration, + bindingHash: metadata.bindingHash, argumentsHash: pending.argumentsHash, argumentsPreview: pending.argumentsPreview } } - - private resolveDenied( - requestId: string, - conversationId: string, - reason: 'denied' | 'cancelled' - ): boolean { - const pending = this.pending.get(requestId) - if (!pending || pending.conversationId !== conversationId) { - return false - } - - this.settleAppPermission(pending, { allowed: false, reason }) - this.deletePending(requestId) - return true - } - - private deletePending(requestId: string): void { - const pending = this.pending.get(requestId) - if (!pending) { - return - } - clearTimeout(pending.timeout) - for (const cleanup of pending.abortCleanups) { - cleanup() - } - pending.abortCleanups.clear() - this.pending.delete(requestId) - } - - private pruneExpired(): void { - const now = Date.now() - for (const pending of this.pending.values()) { - if (pending.expiresAt <= now) { - this.settleAppPermission(pending, { allowed: false, reason: 'timeout' }) - this.deletePending(pending.requestId) - } - } - } - - private attachAbort(pending: PendingPermission, signal?: AbortSignal): void { - if (!signal) { - return - } - const onAbort = () => { - if (this.pending.get(pending.requestId) !== pending) { - return - } - this.settleAppPermission(pending, { allowed: false, reason: 'cancelled' }) - this.deletePending(pending.requestId) - } - signal.addEventListener('abort', onAbort, { once: true }) - pending.abortCleanups.add(() => signal.removeEventListener('abort', onAbort)) - if (signal.aborted) { - onAbort() - } - } - - private settleAppPermission(pending: PendingPermission, decision: ToolPermissionDecision): void { - for (const settle of pending.settlers) { - settle(decision) - } - pending.settlers.clear() - } } diff --git a/src/renderer/api/ApprovalClient.ts b/src/renderer/api/ApprovalClient.ts new file mode 100644 index 0000000000..5bca75b3da --- /dev/null +++ b/src/renderer/api/ApprovalClient.ts @@ -0,0 +1,27 @@ +import type { DeepchatBridge } from '@shared/contracts/bridge' +import { + approvalClosedEvent, + approvalRequestedEvent, + type DeepchatEventPayload +} from '@shared/contracts/events' +import { approvalsResolveRoute } from '@shared/contracts/routes' +import { getDeepchatBridge } from './core' + +export function createApprovalClient(bridge: DeepchatBridge = getDeepchatBridge()) { + return { + onRequested( + listener: (payload: DeepchatEventPayload) => void + ) { + return bridge.on(approvalRequestedEvent.name, listener) + }, + onClosed(listener: (payload: DeepchatEventPayload) => void) { + return bridge.on(approvalClosedEvent.name, listener) + }, + async resolve(requestId: string, decision: 'approved' | 'denied'): Promise { + const result = await bridge.invoke(approvalsResolveRoute.name, { requestId, decision }) + return result.accepted + } + } +} + +export type ApprovalClient = ReturnType diff --git a/src/renderer/src/apps/chat-main/ChatMainApp.vue b/src/renderer/src/apps/chat-main/ChatMainApp.vue index 69b0d4b628..de191db00f 100644 --- a/src/renderer/src/apps/chat-main/ChatMainApp.vue +++ b/src/renderer/src/apps/chat-main/ChatMainApp.vue @@ -25,6 +25,7 @@ import MessageDialog from '@/components/ui/MessageDialog.vue' import McpSamplingDialog from '@/components/mcp/McpSamplingDialog.vue' import McpElicitationDialog from '@/components/mcp/McpElicitationDialog.vue' import McpAppConsentDialog from '@/components/mcp/McpAppConsentDialog.vue' +import CliApprovalDialog from '@/components/cli/CliApprovalDialog.vue' import { initAppStores, useMcpInstallDeeplinkHandler } from '@/lib/storeInitializer' import { ensureIconsLoaded } from '@/lib/iconLoader' import { useFontManager } from '@/composables/useFontManager' @@ -555,6 +556,7 @@ onBeforeUnmount(() => { + diff --git a/src/renderer/src/components/cli/CliApprovalDialog.vue b/src/renderer/src/components/cli/CliApprovalDialog.vue new file mode 100644 index 0000000000..843ae07df5 --- /dev/null +++ b/src/renderer/src/components/cli/CliApprovalDialog.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/renderer/src/stores/cliApproval.ts b/src/renderer/src/stores/cliApproval.ts new file mode 100644 index 0000000000..cf8139829f --- /dev/null +++ b/src/renderer/src/stores/cliApproval.ts @@ -0,0 +1,63 @@ +import { computed, onMounted, onUnmounted, ref, shallowRef } from 'vue' +import { defineStore } from 'pinia' +import { createApprovalClient } from '@api/ApprovalClient' +import type { DeepchatEventPayload } from '@shared/contracts/events' + +const MAX_PENDING_CLI_APPROVALS = 32 + +type ApprovalRequest = DeepchatEventPayload<'approvals.requested'> + +export const useCliApprovalStore = defineStore('cliApproval', () => { + const client = createApprovalClient() + const queue = shallowRef([]) + const isSubmitting = ref(false) + const cleanups: Array<() => void> = [] + const request = computed(() => queue.value[0] ?? null) + const isOpen = computed(() => request.value !== null) + + const remove = (requestId: string) => { + queue.value = queue.value.filter((entry) => entry.requestId !== requestId) + } + + const submit = async (decision: 'approved' | 'denied') => { + const current = request.value + if (!current || isSubmitting.value) return + isSubmitting.value = true + try { + await client.resolve(current.requestId, decision) + remove(current.requestId) + } catch (error) { + console.error('[CLI Approval] Failed to resolve approval:', error) + } finally { + isSubmitting.value = false + } + } + + onMounted(() => { + cleanups.push( + client.onRequested((next) => { + if (queue.value.some((entry) => entry.requestId === next.requestId)) return + if (queue.value.length >= MAX_PENDING_CLI_APPROVALS) { + void client.resolve(next.requestId, 'denied').catch((error) => { + console.error('[CLI Approval] Failed to reject queued approval:', error) + }) + return + } + queue.value = [...queue.value, next] + }), + client.onClosed(({ requestId }) => remove(requestId)) + ) + }) + + onUnmounted(() => { + while (cleanups.length > 0) cleanups.pop()?.() + }) + + return { + request, + isOpen, + isSubmitting, + approve: () => submit('approved'), + deny: () => submit('denied') + } +}) diff --git a/src/shared/contracts/cliCommands.ts b/src/shared/contracts/cliCommands.ts new file mode 100644 index 0000000000..917615d29e --- /dev/null +++ b/src/shared/contracts/cliCommands.ts @@ -0,0 +1,490 @@ +import { + cliCapabilitiesRoute, + cliDoctorRoute, + cliStatusRoute, + cliVersionRoute +} from './routes/cli.routes' +import { + artifactsDeleteRoute, + artifactsDescribeRoute, + artifactsReadRoute +} from './routes/artifacts.routes' +import { audioTranscribeArtifactRoute, audioTranscribeUploadRoute } from './routes/audio.routes' +import { + modelsGetPublicConfigRoute, + modelsInvokeRoute, + modelsListRuntimeRoute, + modelsResetConfigRoute, + modelsSetPublicConfigRoute, + modelsSetStatusRoute +} from './routes/models.routes' +import { + imagesGenerateRoute, + speechGenerateRoute, + videosGenerateRoute +} from './routes/media.routes' +import { + mcpAddPublicRoute, + mcpListPublicRoute, + mcpRemovePublicRoute, + mcpSetPublicStatusRoute, + mcpStartPublicRoute, + mcpStopPublicRoute, + mcpUpdatePublicRoute +} from './routes/mcp.routes' +import { + ocrClearCacheRoute, + ocrExtractArtifactRoute, + ocrExtractUploadRoute, + ocrGetRuntimeStatusRoute +} from './routes/ocr.routes' +import { + providersAddPublicRoute, + providersListPublicRoute, + providersRemoveRoute, + providersSetCredentialRoute, + providersTestPublicConnectionRoute, + providersUpdatePublicRoute +} from './routes/providers.routes' +import { + eventsSubscribeRoute, + runsCancelRoute, + runsGetRoute, + sessionsRunDetachedRoute +} from './routes/runs.routes' +import { settingsGetPublicRoute, settingsUpdatePublicRoute } from './routes/settings.routes' +import { + skillsInstallPublicUrlRoute, + skillsInstallUploadRoute, + skillsListPublicRoute, + skillsSetPublicStatusRoute, + skillsUninstallPublicRoute +} from './routes/skills.routes' + +export type CliRpcContract = + | typeof cliStatusRoute + | typeof cliVersionRoute + | typeof cliCapabilitiesRoute + | typeof cliDoctorRoute + | typeof artifactsDescribeRoute + | typeof artifactsReadRoute + | typeof artifactsDeleteRoute + | typeof modelsInvokeRoute + | typeof imagesGenerateRoute + | typeof videosGenerateRoute + | typeof speechGenerateRoute + | typeof audioTranscribeUploadRoute + | typeof audioTranscribeArtifactRoute + | typeof ocrGetRuntimeStatusRoute + | typeof ocrExtractUploadRoute + | typeof ocrExtractArtifactRoute + | typeof ocrClearCacheRoute + | typeof providersListPublicRoute + | typeof providersTestPublicConnectionRoute + | typeof providersAddPublicRoute + | typeof providersUpdatePublicRoute + | typeof providersSetCredentialRoute + | typeof providersRemoveRoute + | typeof modelsListRuntimeRoute + | typeof modelsGetPublicConfigRoute + | typeof modelsSetStatusRoute + | typeof modelsSetPublicConfigRoute + | typeof modelsResetConfigRoute + | typeof settingsGetPublicRoute + | typeof settingsUpdatePublicRoute + | typeof skillsListPublicRoute + | typeof skillsInstallPublicUrlRoute + | typeof skillsInstallUploadRoute + | typeof skillsSetPublicStatusRoute + | typeof skillsUninstallPublicRoute + | typeof mcpListPublicRoute + | typeof mcpAddPublicRoute + | typeof mcpUpdatePublicRoute + | typeof mcpRemovePublicRoute + | typeof mcpSetPublicStatusRoute + | typeof mcpStartPublicRoute + | typeof mcpStopPublicRoute + | typeof sessionsRunDetachedRoute + | typeof runsGetRoute + | typeof runsCancelRoute + | typeof eventsSubscribeRoute + +export type CliCommandTimeoutClass = 'standard' | 'long-running' | 'approved-mutation' +export type CliAgentInvocation = 'deny' | 'allow' | Readonly<{ contract: CliRpcContract }> + +export type CliCommandDefinition = Readonly<{ + domain: string + verb: string + contract: CliRpcContract + timeoutClass: CliCommandTimeoutClass + agentInvocation: CliAgentInvocation +}> + +const standard = 'standard' as const +const longRunning = 'long-running' as const +const approvedMutation = 'approved-mutation' as const + +export const CLI_COMMAND_DEFINITIONS = [ + { + domain: 'system', + verb: 'status', + contract: cliStatusRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'system', + verb: 'version', + contract: cliVersionRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'system', + verb: 'capabilities', + contract: cliCapabilitiesRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'system', + verb: 'doctor', + contract: cliDoctorRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'artifact', + verb: 'describe', + contract: artifactsDescribeRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'artifact', + verb: 'get', + contract: artifactsReadRoute, + timeoutClass: longRunning, + agentInvocation: 'deny' + }, + { + domain: 'artifact', + verb: 'delete', + contract: artifactsDeleteRoute, + timeoutClass: standard, + agentInvocation: 'deny' + }, + { + domain: 'model', + verb: 'invoke', + contract: modelsInvokeRoute, + timeoutClass: longRunning, + agentInvocation: 'allow' + }, + { + domain: 'image', + verb: 'generate', + contract: imagesGenerateRoute, + timeoutClass: longRunning, + agentInvocation: 'allow' + }, + { + domain: 'video', + verb: 'generate', + contract: videosGenerateRoute, + timeoutClass: longRunning, + agentInvocation: 'allow' + }, + { + domain: 'audio', + verb: 'speak', + contract: speechGenerateRoute, + timeoutClass: longRunning, + agentInvocation: 'allow' + }, + { + domain: 'audio', + verb: 'transcribe', + contract: audioTranscribeUploadRoute, + timeoutClass: longRunning, + agentInvocation: { contract: audioTranscribeArtifactRoute } + }, + { + domain: 'ocr', + verb: 'status', + contract: ocrGetRuntimeStatusRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'ocr', + verb: 'extract', + contract: ocrExtractUploadRoute, + timeoutClass: longRunning, + agentInvocation: { contract: ocrExtractArtifactRoute } + }, + { + domain: 'ocr', + verb: 'clear-cache', + contract: ocrClearCacheRoute, + timeoutClass: longRunning, + agentInvocation: 'deny' + }, + { + domain: 'provider', + verb: 'list', + contract: providersListPublicRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'provider', + verb: 'test', + contract: providersTestPublicConnectionRoute, + timeoutClass: standard, + agentInvocation: 'deny' + }, + { + domain: 'provider', + verb: 'add', + contract: providersAddPublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'provider', + verb: 'update', + contract: providersUpdatePublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'provider', + verb: 'set-credential', + contract: providersSetCredentialRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'provider', + verb: 'clear-credential', + contract: providersSetCredentialRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'provider', + verb: 'remove', + contract: providersRemoveRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'model', + verb: 'list', + contract: modelsListRuntimeRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'model', + verb: 'config-get', + contract: modelsGetPublicConfigRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'model', + verb: 'enable', + contract: modelsSetStatusRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'model', + verb: 'disable', + contract: modelsSetStatusRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'model', + verb: 'config-set', + contract: modelsSetPublicConfigRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'model', + verb: 'config-reset', + contract: modelsResetConfigRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'settings', + verb: 'get', + contract: settingsGetPublicRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'settings', + verb: 'set', + contract: settingsUpdatePublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'allow' + }, + { + domain: 'skill', + verb: 'list', + contract: skillsListPublicRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'skill', + verb: 'install', + contract: skillsInstallPublicUrlRoute, + timeoutClass: longRunning, + agentInvocation: 'allow' + }, + { + domain: 'skill', + verb: 'enable', + contract: skillsSetPublicStatusRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'skill', + verb: 'disable', + contract: skillsSetPublicStatusRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'skill', + verb: 'remove', + contract: skillsUninstallPublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'mcp', + verb: 'list', + contract: mcpListPublicRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'mcp', + verb: 'add', + contract: mcpAddPublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'allow' + }, + { + domain: 'mcp', + verb: 'update', + contract: mcpUpdatePublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'mcp', + verb: 'enable', + contract: mcpSetPublicStatusRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'mcp', + verb: 'disable', + contract: mcpSetPublicStatusRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'mcp', + verb: 'start', + contract: mcpStartPublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'mcp', + verb: 'stop', + contract: mcpStopPublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'mcp', + verb: 'remove', + contract: mcpRemovePublicRoute, + timeoutClass: approvedMutation, + agentInvocation: 'deny' + }, + { + domain: 'agent', + verb: 'run', + contract: sessionsRunDetachedRoute, + timeoutClass: longRunning, + agentInvocation: 'deny' + }, + { + domain: 'run', + verb: 'get', + contract: runsGetRoute, + timeoutClass: standard, + agentInvocation: 'allow' + }, + { + domain: 'run', + verb: 'watch', + contract: eventsSubscribeRoute, + timeoutClass: longRunning, + agentInvocation: 'deny' + }, + { + domain: 'run', + verb: 'cancel', + contract: runsCancelRoute, + timeoutClass: standard, + agentInvocation: 'allow' + } +] as const satisfies readonly CliCommandDefinition[] + +export function cliCommandKey(domain: string, verb: string): string { + return `${domain} ${verb}` +} + +function createCliCommandRegistry( + definitions: readonly CliCommandDefinition[] +): ReadonlyMap { + const registry = new Map() + for (const definition of definitions) { + const key = cliCommandKey(definition.domain, definition.verb) + if (registry.has(key)) throw new Error(`Duplicate CLI command definition: ${key}`) + registry.set(key, definition) + } + return registry +} + +export const CLI_COMMAND_REGISTRY = createCliCommandRegistry(CLI_COMMAND_DEFINITIONS) + +export function getCliCommandDefinition( + domain: string, + verb: string +): CliCommandDefinition | undefined { + return CLI_COMMAND_REGISTRY.get(cliCommandKey(domain, verb)) +} + +export function getAgentCliCommandContract( + definition: CliCommandDefinition +): CliRpcContract | undefined { + if (definition.agentInvocation === 'deny') return undefined + if (definition.agentInvocation === 'allow') return definition.contract + return definition.agentInvocation.contract +} diff --git a/src/shared/contracts/common.ts b/src/shared/contracts/common.ts index 0d937ecad6..a28052bdc2 100644 --- a/src/shared/contracts/common.ts +++ b/src/shared/contracts/common.ts @@ -30,20 +30,18 @@ import { } from '../types/attachment' import { isValidDocumentOcrTextPageSpans } from '../utils/documentOcrText' import { LiveDelegationSubagentContextSchema } from '../orchestration/liveDelegation' +import { JsonValueSchema, TimestampMsSchema } from './json' -export type JsonValue = - | string - | number - | boolean - | null - | JsonValue[] - | { - [key: string]: JsonValue - } +export { + defineEventContract, + defineRouteContract, + type EventContract, + type RouteContract +} from './contract' +export { JsonValueSchema, TimestampMsSchema, type JsonValue } from './json' export const EntityIdSchema = z.string().min(1) export const SubmissionIdSchema = z.string().min(1).max(128) -export const TimestampMsSchema = z.number().int().nonnegative() // A monotonically increasing state token. Unlike TimestampMsSchema, this is not // tied to wall-clock time and is safe for ordered snapshot/event application. @@ -57,17 +55,6 @@ export const ToolCallImagePreviewSchema = z.object({ source: z.enum(['tool_output', 'file_read', 'screenshot', 'mcp_image']) }) -export const JsonValueSchema: z.ZodType = z.lazy(() => - z.union([ - z.string(), - z.number(), - z.boolean(), - z.null(), - z.array(JsonValueSchema), - z.record(z.string(), JsonValueSchema) - ]) -) - export const FileMetadataValueSchema = z.union([JsonValueSchema, z.date()]) export const ImageGenerationOptionsSchema = z @@ -408,12 +395,17 @@ export const SessionWithStateSchema = z.object({ updatedAt: TimestampMsSchema, revision: RevisionSchema.optional(), metadata: z - .object({ - source: z.literal('cron_job'), - cronJobId: EntityIdSchema, - cronJobRunId: EntityIdSchema, - scheduledAt: TimestampMsSchema - }) + .discriminatedUnion('source', [ + z.object({ + source: z.literal('cron_job'), + cronJobId: EntityIdSchema, + cronJobRunId: EntityIdSchema, + scheduledAt: TimestampMsSchema + }), + z.object({ + source: z.literal('cli_run') + }) + ]) .nullable() .optional(), status: SessionStatusSchema, @@ -606,40 +598,3 @@ export const AssistantMessageBlockSchema = z.object({ extra: z.record(z.string(), JsonValueSchema).optional(), action_type: z.enum(['tool_call_permission', 'question_request', 'rate_limit']).optional() }) - -export interface RouteContract< - Name extends string = string, - InputSchema extends z.ZodTypeAny = z.ZodTypeAny, - OutputSchema extends z.ZodTypeAny = z.ZodTypeAny -> { - name: Name - input: InputSchema - output: OutputSchema -} - -export interface EventContract< - Name extends string = string, - PayloadSchema extends z.ZodTypeAny = z.ZodTypeAny -> { - name: Name - payload: PayloadSchema -} - -export function defineRouteContract< - const Name extends string, - InputSchema extends z.ZodTypeAny, - OutputSchema extends z.ZodTypeAny ->(contract: { - name: Name - input: InputSchema - output: OutputSchema -}): RouteContract { - return contract -} - -export function defineEventContract< - const Name extends string, - PayloadSchema extends z.ZodTypeAny ->(contract: { name: Name; payload: PayloadSchema }): EventContract { - return contract -} diff --git a/src/shared/contracts/contract.ts b/src/shared/contracts/contract.ts new file mode 100644 index 0000000000..4ba0f2680e --- /dev/null +++ b/src/shared/contracts/contract.ts @@ -0,0 +1,38 @@ +import type { z } from 'zod' + +export interface RouteContract< + Name extends string = string, + InputSchema extends z.ZodTypeAny = z.ZodTypeAny, + OutputSchema extends z.ZodTypeAny = z.ZodTypeAny +> { + name: Name + input: InputSchema + output: OutputSchema +} + +export interface EventContract< + Name extends string = string, + PayloadSchema extends z.ZodTypeAny = z.ZodTypeAny +> { + name: Name + payload: PayloadSchema +} + +export function defineRouteContract< + const Name extends string, + InputSchema extends z.ZodTypeAny, + OutputSchema extends z.ZodTypeAny +>(contract: { + name: Name + input: InputSchema + output: OutputSchema +}): RouteContract { + return contract +} + +export function defineEventContract< + const Name extends string, + PayloadSchema extends z.ZodTypeAny +>(contract: { name: Name; payload: PayloadSchema }): EventContract { + return contract +} diff --git a/src/shared/contracts/events.ts b/src/shared/contracts/events.ts index aa916415d7..e35f9dcbf7 100644 --- a/src/shared/contracts/events.ts +++ b/src/shared/contracts/events.ts @@ -7,6 +7,7 @@ import { acpTerminalOutputEvent, acpTerminalStartedEvent } from './events/acp-terminal.events' +import { approvalClosedEvent, approvalRequestedEvent } from './events/approvals.events' import { appRuntimeGuidedOnboardingStartRequestedEvent, appRuntimeMcpInstallRequestedEvent, @@ -139,10 +140,18 @@ import { workspaceWatchStatusChangedEvent } from './events/workspace.events' import { liveDelegationChangedEvent } from './events/orchestration.events' +import { + runsCancelRequestedEvent, + runsCreatedEvent, + runsSnapshotEvent, + runsTurnAcceptedEvent, + runsTurnFailedEvent +} from './events/runs.events' export * from './events/browser.events' export * from './events/computerUse.events' export * from './events/acp-terminal.events' +export * from './events/approvals.events' export * from './events/app-runtime.events' export * from './events/chat.events' export * from './events/config.events' @@ -158,6 +167,7 @@ export * from './events/notification.events' export * from './events/oauth.events' export * from './events/orchestration.events' export * from './events/providers.events' +export * from './events/runs.events' export * from './events/settings.events' export * from './events/startup.events' export * from './events/sessions.events' @@ -169,6 +179,8 @@ export * from './events/window.events' export * from './events/workspace.events' export const DEEPCHAT_EVENT_CATALOG = { + [approvalRequestedEvent.name]: approvalRequestedEvent, + [approvalClosedEvent.name]: approvalClosedEvent, [windowStateChangedEvent.name]: windowStateChangedEvent, [workspaceInvalidatedEvent.name]: workspaceInvalidatedEvent, [workspaceWatchStatusChangedEvent.name]: workspaceWatchStatusChangedEvent, @@ -208,6 +220,11 @@ export const DEEPCHAT_EVENT_CATALOG = { [sessionsAcpModesReadyEvent.name]: sessionsAcpModesReadyEvent, [sessionsAcpCommandsReadyEvent.name]: sessionsAcpCommandsReadyEvent, [sessionsAcpConfigOptionsReadyEvent.name]: sessionsAcpConfigOptionsReadyEvent, + [runsCreatedEvent.name]: runsCreatedEvent, + [runsTurnAcceptedEvent.name]: runsTurnAcceptedEvent, + [runsTurnFailedEvent.name]: runsTurnFailedEvent, + [runsCancelRequestedEvent.name]: runsCancelRequestedEvent, + [runsSnapshotEvent.name]: runsSnapshotEvent, [configLanguageChangedEvent.name]: configLanguageChangedEvent, [configThemeChangedEvent.name]: configThemeChangedEvent, [configSystemThemeChangedEvent.name]: configSystemThemeChangedEvent, diff --git a/src/shared/contracts/events/approvals.events.ts b/src/shared/contracts/events/approvals.events.ts new file mode 100644 index 0000000000..b9c56494d3 --- /dev/null +++ b/src/shared/contracts/events/approvals.events.ts @@ -0,0 +1,32 @@ +import { z } from 'zod' +import { JsonValueSchema, TimestampMsSchema, defineEventContract } from '../common' +import { + LocalControlEffectSchema, + LocalControlMethodSchema, + LocalControlPrincipalSchema +} from '../localControl' +import { ApprovalRequestIdSchema } from '../routes/approvals.routes' + +export const approvalRequestedEvent = defineEventContract({ + name: 'approvals.requested', + payload: z + .object({ + requestId: ApprovalRequestIdSchema, + operation: LocalControlMethodSchema, + effect: LocalControlEffectSchema, + principal: LocalControlPrincipalSchema, + expiresAt: TimestampMsSchema, + displayData: JsonValueSchema.optional() + }) + .strict() +}) + +export const approvalClosedEvent = defineEventContract({ + name: 'approvals.closed', + payload: z + .object({ + requestId: ApprovalRequestIdSchema, + reason: z.enum(['approved', 'denied', 'cancelled', 'timeout', 'unavailable']) + }) + .strict() +}) diff --git a/src/shared/contracts/events/runs.events.ts b/src/shared/contracts/events/runs.events.ts new file mode 100644 index 0000000000..0e86909613 --- /dev/null +++ b/src/shared/contracts/events/runs.events.ts @@ -0,0 +1,97 @@ +import { z } from 'zod' +import { + EntityIdSchema, + SessionStatusSchema, + TimestampMsSchema, + defineEventContract +} from '../common' +import { PublicRunSnapshotSchema, RunEventCursorSchema, RunIdSchema } from '../routes/runs.routes' + +export const RunEventRecoveryReasonSchema = z.enum([ + 'cursor_missing', + 'cursor_expired', + 'cursor_ahead', + 'server_restarted' +]) + +export const runsCreatedEvent = defineEventContract({ + name: 'runs.created', + payload: z + .object({ + runId: RunIdSchema, + sessionId: EntityIdSchema, + status: SessionStatusSchema, + createdAt: TimestampMsSchema + }) + .strict() +}) + +export const runsTurnAcceptedEvent = defineEventContract({ + name: 'runs.turn.accepted', + payload: z + .object({ + runId: RunIdSchema, + sessionId: EntityIdSchema, + requestId: EntityIdSchema.nullable(), + messageId: EntityIdSchema.nullable(), + acceptedAt: TimestampMsSchema + }) + .strict() +}) + +export const runsTurnFailedEvent = defineEventContract({ + name: 'runs.turn.failed', + payload: z + .object({ + runId: RunIdSchema, + sessionId: EntityIdSchema, + failedAt: TimestampMsSchema, + error: z.string().min(1).max(4096) + }) + .strict() +}) + +export const runsCancelRequestedEvent = defineEventContract({ + name: 'runs.cancel.requested', + payload: z + .object({ + runId: RunIdSchema, + sessionId: EntityIdSchema, + requestedAt: TimestampMsSchema + }) + .strict() +}) + +export const runsSnapshotEvent = defineEventContract({ + name: 'runs.snapshot', + payload: z + .object({ + cursor: RunEventCursorSchema, + recoveryReason: RunEventRecoveryReasonSchema, + run: PublicRunSnapshotSchema + }) + .strict() +}) + +export const SESSION_RUN_STREAM_EVENT_NAMES = [ + 'chat.stream.updated', + 'chat.stream.completed', + 'chat.stream.failed', + 'chat.plan.updated', + 'sessions.status.changed', + 'sessions.compaction.changed', + 'sessions.acp.modes.ready', + 'sessions.acp.commands.ready', + 'sessions.acp.configOptions.ready' +] as const + +export const RUN_STREAM_EVENT_NAMES = [ + runsCreatedEvent.name, + runsTurnAcceptedEvent.name, + runsTurnFailedEvent.name, + runsCancelRequestedEvent.name, + runsSnapshotEvent.name, + ...SESSION_RUN_STREAM_EVENT_NAMES +] as const + +export const RunStreamEventNameSchema = z.enum(RUN_STREAM_EVENT_NAMES) diff --git a/src/shared/contracts/json.ts b/src/shared/contracts/json.ts new file mode 100644 index 0000000000..7b3a26ffbe --- /dev/null +++ b/src/shared/contracts/json.ts @@ -0,0 +1,24 @@ +import { z } from 'zod' + +export type JsonValue = + | string + | number + | boolean + | null + | JsonValue[] + | { + [key: string]: JsonValue + } + +export const JsonValueSchema: z.ZodType = z.lazy(() => + z.union([ + z.string(), + z.number(), + z.boolean(), + z.null(), + z.array(JsonValueSchema), + z.record(z.string(), JsonValueSchema) + ]) +) + +export const TimestampMsSchema = z.number().int().nonnegative() diff --git a/src/shared/contracts/localControl.ts b/src/shared/contracts/localControl.ts new file mode 100644 index 0000000000..3c35b0d646 --- /dev/null +++ b/src/shared/contracts/localControl.ts @@ -0,0 +1,262 @@ +import { z } from 'zod' +import { JsonValueSchema, TimestampMsSchema, type JsonValue } from './json' + +export const LOCAL_CONTROL_PROTOCOL_VERSION = 1 as const +export const LOCAL_CONTROL_SURFACE_VERSION = 1 as const +export const LOCAL_CONTROL_MAX_REQUEST_TIMEOUT_MS = 30 * 60_000 +export const LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES = 16 * 1024 * 1024 +export const LOCAL_CONTROL_MAX_STREAM_RECORD_BYTES = 20 * 1024 * 1024 +export const LOCAL_CONTROL_DESCRIPTOR_FILENAME = 'local-control.json' +export const LOCAL_CONTROL_RPC_PATH = '/v1/rpc' +export const LOCAL_CONTROL_STREAM_PATH = '/v1/stream' +export const LOCAL_CONTROL_UPLOAD_PATH = '/v1/upload' +export const LOCAL_CONTROL_METHOD_HEADER = 'x-deepchat-method' +export const LOCAL_CONTROL_UPLOAD_REQUEST_HEADER = 'x-deepchat-upload-request' +export const LOCAL_CONTROL_MAX_UPLOAD_REQUEST_HEADER_BYTES = 4 * 1024 +export const LOCAL_CONTROL_ARTIFACT_PATH_PREFIX = '/v1/artifacts/' +export const LOCAL_CONTROL_AGENT_TOKEN_ENV = 'DEEPCHAT_CLI_AGENT_TOKEN' + +export const LOCAL_CONTROL_EFFECTS = [ + 'read', + 'compute', + 'local-maintenance', + 'preference-write', + 'security-config', + 'execution-config', + 'supply-chain', + 'credential', + 'destructive' +] as const + +export const LocalControlEffectSchema = z.enum(LOCAL_CONTROL_EFFECTS) + +export const LOCAL_CONTROL_SCOPES = [ + 'system:read', + 'models:read', + 'models:invoke', + 'media:generate', + 'audio:transcribe', + 'ocr:read', + 'ocr:extract', + 'ocr:manage', + 'sessions:run', + 'runs:read', + 'runs:cancel', + 'artifacts:read', + 'artifacts:manage', + 'settings:read', + 'settings:write', + 'providers:read', + 'providers:write', + 'providers:credential', + 'skills:read', + 'skills:write', + 'mcp:read', + 'mcp:write' +] as const + +export const LocalControlScopeSchema = z.enum(LOCAL_CONTROL_SCOPES) +export const LocalControlScopesSchema = z + .array(LocalControlScopeSchema) + .max(LOCAL_CONTROL_SCOPES.length) + .superRefine((scopes, context) => { + const seen = new Set() + scopes.forEach((scope, index) => { + if (seen.has(scope)) { + context.addIssue({ + code: 'custom', + message: `Duplicate local-control scope: ${scope}`, + path: [index] + }) + } + seen.add(scope) + }) + }) + +export const LocalControlPrincipalSchema = z.enum(['human', 'agent']) + +export const LocalControlTokenSchema = z + .string() + .min(43) + .max(256) + .regex(/^[A-Za-z0-9_-]+$/) + +export const LocalControlEndpointSchema = z.discriminatedUnion('kind', [ + z.object({ + kind: z.literal('unix'), + path: z + .string() + .min(1) + .max(4096) + .refine((value) => !value.includes('\0'), { + message: 'Unix socket path must not contain NUL' + }) + }), + z.object({ + kind: z.literal('pipe'), + name: z + .string() + .min(1) + .max(1024) + .refine((value) => !value.includes('\0'), { + message: 'Named pipe must not contain NUL' + }) + }) +]) + +export const LocalControlDescriptorSchema = z + .object({ + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION), + appVersion: z.string().min(1).max(128), + endpoint: LocalControlEndpointSchema, + pid: z.number().int().positive().max(2_147_483_647), + token: LocalControlTokenSchema, + startedAt: TimestampMsSchema + }) + .strict() + +const LocalControlRequestIdSchema = z + .string() + .min(1) + .max(128) + .regex(/^[A-Za-z0-9._:-]+$/) + +export const LocalControlEventCursorSchema = z + .string() + .min(3) + .max(128) + .regex(/^[A-Za-z0-9_-]+:(?:0|[1-9][0-9]*)$/) + +export const LocalControlMethodSchema = z + .string() + .min(3) + .max(128) + .regex(/^[a-z][A-Za-z0-9]*(?:\.[a-z][A-Za-z0-9]*)+$/) + +export const LocalControlRpcRequestSchema = z + .object({ + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION), + id: LocalControlRequestIdSchema, + method: LocalControlMethodSchema, + params: JsonValueSchema.default({}) + }) + .strict() + +export const LocalControlUploadBindingSchema = z + .object({ + size: z.number().int().positive().max(Number.MAX_SAFE_INTEGER), + sha256: z.string().regex(/^[a-f0-9]{64}$/) + }) + .strict() + +export const LocalControlUploadRequestSchema = LocalControlRpcRequestSchema.extend({ + upload: LocalControlUploadBindingSchema +}).strict() + +export const LOCAL_CONTROL_ERROR_CODES = [ + 'invalid_request', + 'unsupported_version', + 'authentication_failed', + 'permission_denied', + 'approval_denied', + 'approval_timeout', + 'not_found', + 'conflict', + 'rate_limited', + 'body_too_large', + 'result_too_large', + 'unavailable', + 'cancelled', + 'timeout', + 'internal_error' +] as const + +export const LocalControlErrorCodeSchema = z.enum(LOCAL_CONTROL_ERROR_CODES) + +export const LocalControlErrorSchema = z + .object({ + code: LocalControlErrorCodeSchema, + message: z.string().min(1).max(4096), + retriable: z.boolean(), + details: z.record(z.string().max(128), JsonValueSchema).optional() + }) + .strict() + +export const LocalControlRpcResponseSchema = z.discriminatedUnion('ok', [ + z + .object({ + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION), + id: LocalControlRequestIdSchema, + ok: z.literal(true), + result: JsonValueSchema + }) + .strict(), + z + .object({ + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION), + id: LocalControlRequestIdSchema, + ok: z.literal(false), + error: LocalControlErrorSchema + }) + .strict() +]) + +export const LocalControlEventEnvelopeSchema = z + .object({ + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION), + sequence: z.number().int().nonnegative(), + timestamp: TimestampMsSchema, + requestId: LocalControlRequestIdSchema.optional(), + runId: z.string().min(1).max(128).optional(), + cursor: LocalControlEventCursorSchema.optional(), + event: z.string().min(1).max(128), + data: JsonValueSchema + }) + .strict() + +export const LocalControlStreamRecordSchema = z.union([ + LocalControlEventEnvelopeSchema, + LocalControlRpcResponseSchema +]) + +export type LocalControlEffect = z.infer +export type LocalControlScope = z.infer +export type LocalControlPrincipal = z.infer +export type LocalControlEndpoint = z.infer +export type LocalControlDescriptor = z.infer +export type LocalControlRpcRequest = z.infer +export type LocalControlUploadBinding = z.infer +export type LocalControlUploadRequest = z.infer +export type LocalControlErrorCode = z.infer +export type LocalControlError = z.infer +export type LocalControlRpcResponse = z.infer +export type LocalControlEventEnvelope = z.infer +export type LocalControlStreamRecord = z.infer + +export function createLocalControlSuccess(id: string, result: JsonValue): LocalControlRpcResponse { + return LocalControlRpcResponseSchema.parse({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + id, + ok: true, + result + }) +} + +export function createLocalControlFailure( + id: string, + error: LocalControlError +): LocalControlRpcResponse { + return LocalControlRpcResponseSchema.parse({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + id, + ok: false, + error + }) +} diff --git a/src/shared/contracts/routes.ts b/src/shared/contracts/routes.ts index 9628df3952..c778522696 100644 --- a/src/shared/contracts/routes.ts +++ b/src/shared/contracts/routes.ts @@ -1,5 +1,12 @@ import type { z } from 'zod' import type { RouteContract } from './common' +import { approvalsResolveRoute } from './routes/approvals.routes' +import { + artifactsDeleteRoute, + artifactsDescribeRoute, + artifactsReadRoute +} from './routes/artifacts.routes' +import { audioTranscribeArtifactRoute, audioTranscribeUploadRoute } from './routes/audio.routes' import { acpTerminalInputRoute, acpTerminalKillRoute } from './routes/acp-terminal.routes' import { browserAttachCurrentWindowRoute, @@ -74,6 +81,17 @@ import { memorySetPersonaAnchorRoute, memoryUpdateRoute } from './routes/memory.routes' +import { + cliCapabilitiesRoute, + cliDoctorRoute, + cliStatusRoute, + cliVersionRoute +} from './routes/cli.routes' +import { + imagesGenerateRoute, + speechGenerateRoute, + videosGenerateRoute +} from './routes/media.routes' import { configAddCustomPromptRoute, configAddManualAcpAgentRoute, @@ -186,6 +204,7 @@ import { knowledgeValidateFileRoute } from './routes/knowledge.routes' import { + mcpAddPublicRoute, mcpAddServerRoute, mcpAppsAuthorizeMessageRoute, mcpAppsCallToolRoute, @@ -225,11 +244,13 @@ import { mcpGetServersRoute, mcpIsServerRunningRoute, mcpListPromptsRoute, + mcpListPublicRoute, mcpListResourcesRoute, mcpListToolDefinitionsRoute, mcpLogoutServerAuthRoute, mcpReadResourceRoute, mcpRefreshNpmRegistryRoute, + mcpRemovePublicRoute, mcpRemoveServerRoute, mcpRouterGetApiKeyRoute, mcpRouterInstallServerRoute, @@ -240,12 +261,16 @@ import { mcpSetAutoDetectNpmRegistryRoute, mcpSetCustomNpmRegistryRoute, mcpSetEnabledRoute, + mcpSetPublicStatusRoute, mcpSetServerEnabledRoute, + mcpStartPublicRoute, mcpStartServerAuthRoute, mcpStartServerRoute, + mcpStopPublicRoute, mcpStopServerRoute, mcpSubmitSamplingDecisionRoute, mcpSubmitElicitationDecisionRoute, + mcpUpdatePublicRoute, mcpUpdateServerRoute } from './routes/mcp.routes' import { @@ -253,15 +278,18 @@ import { modelsExportConfigsRoute, modelsGetCapabilitiesRoute, modelsGetConfigRoute, + modelsGetPublicConfigRoute, modelsGetProviderCatalogRoute, modelsGetProviderConfigsRoute, modelsHasUserConfigRoute, modelsImportConfigsRoute, + modelsInvokeRoute, modelsListRuntimeRoute, modelsRemoveCustomRoute, modelsResetConfigRoute, modelsSetBatchStatusRoute, modelsSetConfigRoute, + modelsSetPublicConfigRoute, modelsSetStatusRoute, modelsTranscribeAudioRoute, modelsUpdateCustomRoute @@ -270,7 +298,12 @@ import { notificationAcknowledgePresentationRoute, notificationRendererReadyRoute } from './routes/notification.routes' -import { ocrClearCacheRoute, ocrGetRuntimeStatusRoute } from './routes/ocr.routes' +import { + ocrClearCacheRoute, + ocrExtractArtifactRoute, + ocrExtractUploadRoute, + ocrGetRuntimeStatusRoute +} from './routes/ocr.routes' import { onboardingCompleteRoute, onboardingGetStateRoute, @@ -336,6 +369,7 @@ import { cronJobsUpsertRoute } from './routes/cronJobs.routes' import { + providersAddPublicRoute, providersAddRoute, providersGetAcpProcessConfigOptionsRoute, providersGetEmbeddingDimensionsRoute, @@ -347,6 +381,7 @@ import { providersListModelsRoute, providersListOllamaModelsRoute, providersListOllamaRunningModelsRoute, + providersListPublicRoute, providersListRoute, providersListSummariesRoute, providersPullOllamaModelRoute, @@ -354,10 +389,13 @@ import { providersRemoveRoute, providersReorderRoute, providersRunAcpDebugActionRoute, + providersSetCredentialRoute, providersSetByIdRoute, providersSyncModelScopeMcpServersRoute, providersTestConnectionRoute, + providersTestPublicConnectionRoute, providersUpdateRateLimitRoute, + providersUpdatePublicRoute, providersUpdateRoute, providersWarmupAcpProcessRoute } from './routes/providers.routes' @@ -382,8 +420,10 @@ import { } from './routes/plugins.routes' import { settingsActivityListRoute, + settingsGetPublicRoute, settingsGetSnapshotRoute, settingsListSystemFontsRoute, + settingsUpdatePublicRoute, settingsUpdateRoute } from './routes/settings.routes' import { @@ -393,6 +433,12 @@ import { } from './routes/shortcut.routes' import { startupGetBootstrapRoute } from './routes/startup.routes' import { performanceRecordRendererRoute } from './routes/performance.routes' +import { + eventsSubscribeRoute, + runsCancelRoute, + runsGetRoute, + sessionsRunDetachedRoute +} from './routes/runs.routes' import { sessionsActivateRoute, sessionsClearMessagesRoute, @@ -460,8 +506,11 @@ import { skillsExecuteAgentImportRoute, skillsInstallFromGitRoute, skillsInstallFromFolderRoute, + skillsInstallPublicUrlRoute, + skillsInstallUploadRoute, skillsInstallFromUrlRoute, skillsInstallFromZipRoute, + skillsListPublicRoute, skillsListCatalogRoute, skillsListAgentImportSourcesRoute, skillsListMetadataRoute, @@ -476,7 +525,9 @@ import { skillsSaveWithExtensionRoute, skillsSetActiveRoute, skillsSetDisabledRoute, + skillsSetPublicStatusRoute, skillsSetSyncDirectoryRoute, + skillsUninstallPublicRoute, skillsUninstallRoute, skillsUpdateFileRoute } from './routes/skills.routes' @@ -554,6 +605,9 @@ import { } from './routes/orchestration.routes' export * from './routes/browser.routes' +export * from './routes/approvals.routes' +export * from './routes/artifacts.routes' +export * from './routes/audio.routes' export * from './routes/computerUse.routes' export * from './routes/acp-terminal.routes' export * from './routes/chat.routes' @@ -564,8 +618,10 @@ export * from './routes/dialog.routes' export * from './routes/device.routes' export * from './routes/file.routes' export * from './routes/knowledge.routes' +export * from './routes/cli.routes' export * from './routes/mcp.routes' export * from './routes/memory.routes' +export * from './routes/media.routes' export * from './routes/models.routes' export * from './routes/notification.routes' export * from './routes/nowledgeMem.routes' @@ -576,6 +632,7 @@ export * from './routes/plugins.routes' export * from './routes/performance.routes' export * from './routes/providers.routes' export * from './routes/project.routes' +export * from './routes/runs.routes' export * from './routes/remote-control.routes' export * from './routes/cronJobs.routes' export * from './routes/settings.routes' @@ -597,6 +654,7 @@ export * from './routes/orchestration.routes' // TS 的类型序列化上限触发 TS7056。拆成多块后每块单独序列化,合并类型只保存引用, // 既绕过上限又保留逐路由精确的输入/输出类型。新增路由追加到任意一块即可,保持各块体量适中。 const DEEPCHAT_ROUTE_CATALOG_PART_1 = { + [approvalsResolveRoute.name]: approvalsResolveRoute, [acpTerminalInputRoute.name]: acpTerminalInputRoute, [acpTerminalKillRoute.name]: acpTerminalKillRoute, [shortcutRegisterRoute.name]: shortcutRegisterRoute, @@ -830,8 +888,10 @@ const DEEPCHAT_ROUTE_CATALOG_PART_3 = { [configGetAwsBedrockCredentialRoute.name]: configGetAwsBedrockCredentialRoute, [configSetAwsBedrockCredentialRoute.name]: configSetAwsBedrockCredentialRoute, [settingsGetSnapshotRoute.name]: settingsGetSnapshotRoute, + [settingsGetPublicRoute.name]: settingsGetPublicRoute, [settingsListSystemFontsRoute.name]: settingsListSystemFontsRoute, [settingsUpdateRoute.name]: settingsUpdateRoute, + [settingsUpdatePublicRoute.name]: settingsUpdatePublicRoute, [settingsActivityListRoute.name]: settingsActivityListRoute, [startupGetBootstrapRoute.name]: startupGetBootstrapRoute, [performanceRecordRendererRoute.name]: performanceRecordRendererRoute @@ -892,6 +952,10 @@ const DEEPCHAT_ROUTE_CATALOG_PART_4 = { [sessionsUpdateGenerationSettingsRoute.name]: sessionsUpdateGenerationSettingsRoute, [providersListRoute.name]: providersListRoute, [providersListSummariesRoute.name]: providersListSummariesRoute, + [providersListPublicRoute.name]: providersListPublicRoute, + [providersAddPublicRoute.name]: providersAddPublicRoute, + [providersUpdatePublicRoute.name]: providersUpdatePublicRoute, + [providersSetCredentialRoute.name]: providersSetCredentialRoute, [providersListDefaultsRoute.name]: providersListDefaultsRoute, [providersSetByIdRoute.name]: providersSetByIdRoute, [providersUpdateRoute.name]: providersUpdateRoute, @@ -900,6 +964,7 @@ const DEEPCHAT_ROUTE_CATALOG_PART_4 = { [providersReorderRoute.name]: providersReorderRoute, [providersListModelsRoute.name]: providersListModelsRoute, [providersTestConnectionRoute.name]: providersTestConnectionRoute, + [providersTestPublicConnectionRoute.name]: providersTestPublicConnectionRoute, [providersGetRateLimitStatusRoute.name]: providersGetRateLimitStatusRoute, [providersGetKeyStatusRoute.name]: providersGetKeyStatusRoute, [providersUpdateRateLimitRoute.name]: providersUpdateRateLimitRoute, @@ -915,6 +980,12 @@ const DEEPCHAT_ROUTE_CATALOG_PART_4 = { [providersImportScanRoute.name]: providersImportScanRoute, [providersImportApplyRoute.name]: providersImportApplyRoute, [modelsGetProviderCatalogRoute.name]: modelsGetProviderCatalogRoute, + [modelsInvokeRoute.name]: modelsInvokeRoute, + [imagesGenerateRoute.name]: imagesGenerateRoute, + [videosGenerateRoute.name]: videosGenerateRoute, + [speechGenerateRoute.name]: speechGenerateRoute, + [audioTranscribeUploadRoute.name]: audioTranscribeUploadRoute, + [audioTranscribeArtifactRoute.name]: audioTranscribeArtifactRoute, [modelsListRuntimeRoute.name]: modelsListRuntimeRoute, [modelsSetBatchStatusRoute.name]: modelsSetBatchStatusRoute, [modelsSetStatusRoute.name]: modelsSetStatusRoute, @@ -922,7 +993,9 @@ const DEEPCHAT_ROUTE_CATALOG_PART_4 = { [modelsRemoveCustomRoute.name]: modelsRemoveCustomRoute, [modelsUpdateCustomRoute.name]: modelsUpdateCustomRoute, [modelsGetConfigRoute.name]: modelsGetConfigRoute, + [modelsGetPublicConfigRoute.name]: modelsGetPublicConfigRoute, [modelsSetConfigRoute.name]: modelsSetConfigRoute, + [modelsSetPublicConfigRoute.name]: modelsSetPublicConfigRoute, [modelsResetConfigRoute.name]: modelsResetConfigRoute, [modelsGetProviderConfigsRoute.name]: modelsGetProviderConfigsRoute, [modelsHasUserConfigRoute.name]: modelsHasUserConfigRoute, @@ -933,6 +1006,17 @@ const DEEPCHAT_ROUTE_CATALOG_PART_4 = { } satisfies Record const DEEPCHAT_ROUTE_CATALOG_PART_5 = { + [sessionsRunDetachedRoute.name]: sessionsRunDetachedRoute, + [runsGetRoute.name]: runsGetRoute, + [runsCancelRoute.name]: runsCancelRoute, + [eventsSubscribeRoute.name]: eventsSubscribeRoute, + [artifactsDescribeRoute.name]: artifactsDescribeRoute, + [artifactsReadRoute.name]: artifactsReadRoute, + [artifactsDeleteRoute.name]: artifactsDeleteRoute, + [cliStatusRoute.name]: cliStatusRoute, + [cliVersionRoute.name]: cliVersionRoute, + [cliCapabilitiesRoute.name]: cliCapabilitiesRoute, + [cliDoctorRoute.name]: cliDoctorRoute, [chatCancelSubmissionRoute.name]: chatCancelSubmissionRoute, [chatSendMessageRoute.name]: chatSendMessageRoute, [chatSteerActiveTurnRoute.name]: chatSteerActiveTurnRoute, @@ -977,12 +1061,17 @@ const DEEPCHAT_ROUTE_CATALOG_PART_5 = { [memoryDeleteDirectiveRoute.name]: memoryDeleteDirectiveRoute, [ocrGetRuntimeStatusRoute.name]: ocrGetRuntimeStatusRoute, [ocrClearCacheRoute.name]: ocrClearCacheRoute, + [ocrExtractUploadRoute.name]: ocrExtractUploadRoute, + [ocrExtractArtifactRoute.name]: ocrExtractArtifactRoute, [skillsListMetadataRoute.name]: skillsListMetadataRoute, [skillsListCatalogRoute.name]: skillsListCatalogRoute, + [skillsListPublicRoute.name]: skillsListPublicRoute, [skillsGetDirectoryRoute.name]: skillsGetDirectoryRoute, [skillsInstallFromFolderRoute.name]: skillsInstallFromFolderRoute, [skillsInstallFromZipRoute.name]: skillsInstallFromZipRoute, [skillsInstallFromUrlRoute.name]: skillsInstallFromUrlRoute, + [skillsInstallPublicUrlRoute.name]: skillsInstallPublicUrlRoute, + [skillsInstallUploadRoute.name]: skillsInstallUploadRoute, [skillsScanGitRepoRoute.name]: skillsScanGitRepoRoute, [skillsInstallFromGitRoute.name]: skillsInstallFromGitRoute, [skillsGetSyncConfigRoute.name]: skillsGetSyncConfigRoute, @@ -992,6 +1081,7 @@ const DEEPCHAT_ROUTE_CATALOG_PART_5 = { [skillsPreviewSyncDirectoryImportRoute.name]: skillsPreviewSyncDirectoryImportRoute, [skillsExecuteSyncDirectoryImportRoute.name]: skillsExecuteSyncDirectoryImportRoute, [skillsUninstallRoute.name]: skillsUninstallRoute, + [skillsUninstallPublicRoute.name]: skillsUninstallPublicRoute, [skillsReadFileRoute.name]: skillsReadFileRoute, [skillsUpdateFileRoute.name]: skillsUpdateFileRoute, [skillsSaveWithExtensionRoute.name]: skillsSaveWithExtensionRoute, @@ -1003,6 +1093,7 @@ const DEEPCHAT_ROUTE_CATALOG_PART_5 = { [skillsGetActiveRoute.name]: skillsGetActiveRoute, [skillsSetActiveRoute.name]: skillsSetActiveRoute, [skillsSetDisabledRoute.name]: skillsSetDisabledRoute, + [skillsSetPublicStatusRoute.name]: skillsSetPublicStatusRoute, [skillsListAgentImportSourcesRoute.name]: skillsListAgentImportSourcesRoute, [skillsPreviewAgentImportRoute.name]: skillsPreviewAgentImportRoute, [skillsExecuteAgentImportRoute.name]: skillsExecuteAgentImportRoute, @@ -1015,6 +1106,7 @@ const DEEPCHAT_ROUTE_CATALOG_PART_5 = { [skillSyncGetAgentSkillDetailRoute.name]: skillSyncGetAgentSkillDetailRoute, [skillSyncRepairAgentSkillLinkRoute.name]: skillSyncRepairAgentSkillLinkRoute, [skillSyncRemoveAgentSkillLinkRoute.name]: skillSyncRemoveAgentSkillLinkRoute, + [mcpListPublicRoute.name]: mcpListPublicRoute, [mcpGetServersRoute.name]: mcpGetServersRoute, [mcpGetEnabledRoute.name]: mcpGetEnabledRoute, [mcpGetClientsRoute.name]: mcpGetClientsRoute, @@ -1022,13 +1114,19 @@ const DEEPCHAT_ROUTE_CATALOG_PART_5 = { [mcpListPromptsRoute.name]: mcpListPromptsRoute, [mcpListResourcesRoute.name]: mcpListResourcesRoute, [mcpCallToolRoute.name]: mcpCallToolRoute, + [mcpAddPublicRoute.name]: mcpAddPublicRoute, [mcpAddServerRoute.name]: mcpAddServerRoute, + [mcpUpdatePublicRoute.name]: mcpUpdatePublicRoute, [mcpUpdateServerRoute.name]: mcpUpdateServerRoute, + [mcpRemovePublicRoute.name]: mcpRemovePublicRoute, [mcpRemoveServerRoute.name]: mcpRemoveServerRoute, + [mcpSetPublicStatusRoute.name]: mcpSetPublicStatusRoute, [mcpSetServerEnabledRoute.name]: mcpSetServerEnabledRoute, [mcpSetEnabledRoute.name]: mcpSetEnabledRoute, [mcpIsServerRunningRoute.name]: mcpIsServerRunningRoute, + [mcpStartPublicRoute.name]: mcpStartPublicRoute, [mcpStartServerRoute.name]: mcpStartServerRoute, + [mcpStopPublicRoute.name]: mcpStopPublicRoute, [mcpStopServerRoute.name]: mcpStopServerRoute, [mcpGetServerAuthStatusRoute.name]: mcpGetServerAuthStatusRoute, [mcpGetServerDiagnosticsRoute.name]: mcpGetServerDiagnosticsRoute, diff --git a/src/shared/contracts/routes/approvals.routes.ts b/src/shared/contracts/routes/approvals.routes.ts new file mode 100644 index 0000000000..3282aa6fd5 --- /dev/null +++ b/src/shared/contracts/routes/approvals.routes.ts @@ -0,0 +1,19 @@ +import { z } from 'zod' +import { defineRouteContract } from '../contract' + +export const ApprovalRequestIdSchema = z + .string() + .min(16) + .max(128) + .regex(/^[A-Za-z0-9_-]+$/) + +export const approvalsResolveRoute = defineRouteContract({ + name: 'approvals.resolve', + input: z + .object({ + requestId: ApprovalRequestIdSchema, + decision: z.enum(['approved', 'denied']) + }) + .strict(), + output: z.object({ accepted: z.boolean() }).strict() +}) diff --git a/src/shared/contracts/routes/artifacts.routes.ts b/src/shared/contracts/routes/artifacts.routes.ts new file mode 100644 index 0000000000..41eb7cda32 --- /dev/null +++ b/src/shared/contracts/routes/artifacts.routes.ts @@ -0,0 +1,61 @@ +import { z } from 'zod' +import { defineRouteContract } from '../contract' +import { TimestampMsSchema } from '../json' + +const MAX_DATE_TIMESTAMP_MS = 8_640_000_000_000_000 + +export const ArtifactIdSchema = z + .string() + .min(16) + .max(128) + .regex(/^[A-Za-z0-9_-]+$/) + +export const ArtifactMetadataSchema = z + .object({ + id: ArtifactIdSchema, + requestId: z + .string() + .min(1) + .max(128) + .regex(/^[A-Za-z0-9._:-]+$/), + owner: z.enum(['human', 'agent']), + mimeType: z + .string() + .min(3) + .max(255) + .regex( + /^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+(?:;\s*[A-Za-z0-9!#$&^_.+-]+=[A-Za-z0-9!#$&^_.+-]+)*$/ + ), + size: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER), + sha256: z + .string() + .length(64) + .regex(/^[a-f0-9]+$/), + filename: z.string().min(1).max(255), + createdAt: TimestampMsSchema.max(MAX_DATE_TIMESTAMP_MS), + expiresAt: TimestampMsSchema.max(MAX_DATE_TIMESTAMP_MS) + }) + .strict() + .refine((artifact) => artifact.expiresAt > artifact.createdAt, { + message: 'Artifact expiry must be later than creation' + }) + +export const artifactsDescribeRoute = defineRouteContract({ + name: 'artifacts.describe', + input: z.object({ id: ArtifactIdSchema }).strict(), + output: z.object({ artifact: ArtifactMetadataSchema }).strict() +}) + +export const artifactsReadRoute = defineRouteContract({ + name: 'artifacts.read', + input: z.object({ id: ArtifactIdSchema }).strict(), + output: z.object({ artifact: ArtifactMetadataSchema }).strict() +}) + +export const artifactsDeleteRoute = defineRouteContract({ + name: 'artifacts.delete', + input: z.object({ id: ArtifactIdSchema }).strict(), + output: z.object({ deleted: z.literal(true) }).strict() +}) + +export type ArtifactMetadata = z.infer diff --git a/src/shared/contracts/routes/audio.routes.ts b/src/shared/contracts/routes/audio.routes.ts new file mode 100644 index 0000000000..1d4423c328 --- /dev/null +++ b/src/shared/contracts/routes/audio.routes.ts @@ -0,0 +1,76 @@ +import { z } from 'zod' +import { EntityIdSchema, defineRouteContract } from '../common' +import { ArtifactIdSchema } from './artifacts.routes' + +export const AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES = 25 * 1024 * 1024 +export const AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS = 1_000_000 + +export const AudioInputMimeTypeSchema = z + .string() + .trim() + .min(7) + .max(255) + .transform((value) => value.toLowerCase()) + .refine( + (value) => + /^audio\/[a-z0-9!#$&^_.+-]+(?:;\s*[a-z0-9!#$&^_.+-]+=[a-z0-9!#$&^_.+-]+)*$/.test(value), + { message: 'Invalid audio MIME type' } + ) + +export const AudioInputFilenameSchema = z + .string() + .trim() + .min(1) + .max(255) + .refine((value) => value !== '.' && value !== '..' && !/[\\/\p{Cc}]/u.test(value), { + message: 'Invalid input filename' + }) + +export const AudioTranscriptionUploadInputSchema = z + .object({ + providerId: EntityIdSchema.max(128), + modelId: z.string().min(1).max(256), + mimeType: AudioInputMimeTypeSchema, + filename: AudioInputFilenameSchema.optional() + }) + .strict() + +export const AudioTranscriptionArtifactInputSchema = z + .object({ + providerId: EntityIdSchema.max(128), + modelId: z.string().min(1).max(256), + artifactId: ArtifactIdSchema + }) + .strict() + +export const AudioTranscriptionOutputSchema = z + .object({ + providerId: EntityIdSchema.max(128), + modelId: z.string().min(1).max(256), + text: z.string().max(AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS), + truncated: z.boolean(), + inputBytes: z.number().int().positive().max(AUDIO_TRANSCRIPTION_MAX_INPUT_BYTES), + mimeType: AudioInputMimeTypeSchema, + durationMs: z + .number() + .finite() + .nonnegative() + .max(24 * 60 * 60_000) + }) + .strict() + +export const audioTranscribeUploadRoute = defineRouteContract({ + name: 'audio.transcribeUpload', + input: AudioTranscriptionUploadInputSchema, + output: AudioTranscriptionOutputSchema +}) + +export const audioTranscribeArtifactRoute = defineRouteContract({ + name: 'audio.transcribeArtifact', + input: AudioTranscriptionArtifactInputSchema, + output: AudioTranscriptionOutputSchema +}) + +export type AudioTranscriptionUploadInput = z.infer +export type AudioTranscriptionArtifactInput = z.infer +export type AudioTranscriptionOutput = z.infer diff --git a/src/shared/contracts/routes/cli.routes.ts b/src/shared/contracts/routes/cli.routes.ts new file mode 100644 index 0000000000..546bd642e9 --- /dev/null +++ b/src/shared/contracts/routes/cli.routes.ts @@ -0,0 +1,86 @@ +import { z } from 'zod' +import { defineRouteContract } from '../contract' +import { + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION, + LocalControlEffectSchema, + LocalControlMethodSchema, + LocalControlPrincipalSchema, + LocalControlScopesSchema +} from '../localControl' + +export const LocalControlTransportSchema = z.enum(['rpc', 'stream', 'upload', 'download']) +export const LocalControlApprovalModeSchema = z.enum(['never', 'policy']) +const LocalControlCallersSchema = z + .array(LocalControlPrincipalSchema) + .min(1) + .max(2) + .refine((callers) => new Set(callers).size === callers.length, { + message: 'Duplicate local-control caller' + }) + +export const LocalControlCapabilitySchema = z + .object({ + method: LocalControlMethodSchema, + possibleEffects: z.array(LocalControlEffectSchema).min(1), + callers: LocalControlCallersSchema, + scopes: LocalControlScopesSchema.min(1), + transport: LocalControlTransportSchema, + approval: LocalControlApprovalModeSchema, + maxBodyBytes: z.number().int().positive(), + timeoutMs: z.number().int().positive() + }) + .strict() + +export const cliStatusRoute = defineRouteContract({ + name: 'cli.status', + input: z.object({}).default({}), + output: z.object({ + running: z.boolean(), + pid: z.number().int().positive(), + startedAt: z.number().int().nonnegative(), + uptimeMs: z.number().int().nonnegative(), + endpointKind: z.enum(['unix', 'pipe']), + activeConnections: z.number().int().nonnegative(), + pendingRequests: z.number().int().nonnegative() + }) +}) + +export const cliVersionRoute = defineRouteContract({ + name: 'cli.version', + input: z.object({}).default({}), + output: z.object({ + appVersion: z.string().min(1), + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION) + }) +}) + +export const cliCapabilitiesRoute = defineRouteContract({ + name: 'cli.capabilities', + input: z.object({}).default({}), + output: z.object({ + protocolVersion: z.literal(LOCAL_CONTROL_PROTOCOL_VERSION), + surfaceVersion: z.literal(LOCAL_CONTROL_SURFACE_VERSION), + capabilities: z.array(LocalControlCapabilitySchema) + }) +}) + +export const cliDoctorRoute = defineRouteContract({ + name: 'cli.doctor', + input: z.object({}).default({}), + output: z.object({ + healthy: z.boolean(), + checks: z.array( + z + .object({ + id: z.enum(['transport', 'descriptor', 'surface', 'renderer']), + status: z.enum(['ok', 'warning', 'error']), + message: z.string().min(1).max(1024) + }) + .strict() + ) + }) +}) + +export type CliCapability = z.infer diff --git a/src/shared/contracts/routes/mcp.routes.ts b/src/shared/contracts/routes/mcp.routes.ts index fb62661b79..1a54ac9172 100644 --- a/src/shared/contracts/routes/mcp.routes.ts +++ b/src/shared/contracts/routes/mcp.routes.ts @@ -90,6 +90,409 @@ const MCPServerConfigUpdateSchema: z.ZodType> = MCPServerConfigObjectSchema.partial().refine(isBoundedServerConfig, { message: 'MCP server configuration exceeds the 3 MiB route limit' }) + +// Leave room for the route envelope inside ApprovalBroker's 1 MiB argument binding. +export const PUBLIC_MCP_CONFIG_MAX_BYTES = 768 * 1024 +export const PUBLIC_MCP_DESCRIPTION_MAX_CHARACTERS = 16 * 1024 +export const PUBLIC_MCP_ICON_MAX_CHARACTERS = 128 +export const PUBLIC_MCP_LIST_MAX_ITEMS = 512 + +function isSafePublicMcpDisplayText(value: string): boolean { + for (const character of value) { + const codePoint = character.codePointAt(0)! + if ( + codePoint <= 0x1f || + (codePoint >= 0x7f && codePoint <= 0x9f) || + codePoint === 0x061c || + codePoint === 0x200e || + codePoint === 0x200f || + (codePoint >= 0x202a && codePoint <= 0x202e) || + (codePoint >= 0x2066 && codePoint <= 0x2069) + ) { + return false + } + } + return true +} + +function isBoundedPublicMcpConfig(value: unknown): boolean { + try { + return ( + new TextEncoder().encode(JSON.stringify(value) ?? 'null').byteLength <= + PUBLIC_MCP_CONFIG_MAX_BYTES + ) + } catch { + return false + } +} + +export const PublicMcpServerNameSchema = z + .string() + .min(1) + .max(256) + .refine((value) => value === value.trim(), { + message: 'MCP server name must not have surrounding whitespace' + }) + .refine(isSafePublicMcpDisplayText, { + message: 'MCP server name contains unsafe display characters' + }) + .refine( + (value) => + value !== 'prototype' && !Object.prototype.hasOwnProperty.call(Object.prototype, value), + { message: 'MCP server name conflicts with an object property' } + ) + +const PublicMcpDescriptionSchema = z.string().max(PUBLIC_MCP_DESCRIPTION_MAX_CHARACTERS) +const PublicMcpIconSchema = z + .string() + .max(PUBLIC_MCP_ICON_MAX_CHARACTERS) + .refine(isSafePublicMcpDisplayText, { + message: 'MCP server icon contains unsafe display characters' + }) +const PublicMcpCommandSchema = z + .string() + .trim() + .min(1) + .max(4096) + .refine((value) => !value.includes('\0'), { message: 'MCP command must not contain NUL' }) +const PublicMcpArgumentSchema = z + .string() + .max(8192) + .refine((value) => !value.includes('\0'), { message: 'MCP argument must not contain NUL' }) +const PublicMcpEnvironmentSchema = z + .record( + z + .string() + .regex(/^[A-Za-z_][A-Za-z0-9_]*$/) + .max(256), + z + .string() + .max(64 * 1024) + .refine((value) => !value.includes('\0'), { + message: 'MCP environment value must not contain NUL' + }) + ) + .refine((value) => Object.keys(value).length <= 256, { + message: 'MCP environment has too many entries' + }) + .refine( + (value) => { + const keys = Object.keys(value).map((key) => key.toLowerCase()) + return new Set(keys).size === keys.length + }, + { message: 'MCP environment contains case-insensitive duplicate names' } + ) +const PublicMcpHeadersSchema = z + .record( + z + .string() + .min(1) + .max(128) + .regex(/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/), + z + .string() + .max(64 * 1024) + .refine((value) => !value.includes('\0') && !value.includes('\r') && !value.includes('\n'), { + message: 'MCP header value contains an unsafe character' + }) + ) + .refine((value) => Object.keys(value).length <= 256, { + message: 'MCP headers have too many entries' + }) + .refine( + (value) => { + const keys = Object.keys(value).map((key) => key.toLowerCase()) + return new Set(keys).size === keys.length + }, + { message: 'MCP headers contain case-insensitive duplicate names' } + ) + +const PublicMcpSecureUrlSchema = z + .url() + .max(8192) + .superRefine((value, context) => { + let url: URL + try { + url = new URL(value) + } catch { + context.addIssue({ code: 'custom', message: 'MCP URL is invalid' }) + return + } + const loopback = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname.toLowerCase()) + if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) { + context.addIssue({ + code: 'custom', + message: 'MCP URL must use HTTPS or loopback HTTP' + }) + } + if (url.username || url.password || url.search || url.hash) { + context.addIssue({ + code: 'custom', + message: 'MCP URL must not contain credentials, query parameters, or a fragment' + }) + } + }) + +const PublicMcpAuthorizationConfigSchema = z + .object({ + mode: z.enum([ + 'none', + 'interactive', + 'client_credentials', + 'private_key_jwt', + 'cross_app_access' + ]), + protectedResourceUrl: PublicMcpSecureUrlSchema.optional(), + authorizationServerIssuer: PublicMcpSecureUrlSchema.optional(), + clientMetadataUrl: PublicMcpSecureUrlSchema.optional(), + clientId: z.string().min(1).max(2048).refine(isSafePublicMcpDisplayText).optional(), + scopes: z + .array( + z + .string() + .min(1) + .max(512) + .regex(/^[\x21\x23-\x5b\x5d-\x7e]+$/) + ) + .max(128) + .optional(), + identityProfileId: z.string().min(1).max(512).refine(isSafePublicMcpDisplayText).optional(), + keyAlgorithm: z.enum(['RS256', 'ES256']).optional() + }) + .strict() + .superRefine((value, context) => { + const machineMode = + value.mode === 'client_credentials' || + value.mode === 'private_key_jwt' || + value.mode === 'cross_app_access' + if (!machineMode) return + + for (const field of [ + 'protectedResourceUrl', + 'authorizationServerIssuer', + 'clientId' + ] as const) { + if (!value[field]) { + context.addIssue({ + code: 'custom', + path: [field], + message: `${field} is required for machine authorization` + }) + } + } + if (value.mode === 'private_key_jwt' && !value.keyAlgorithm) { + context.addIssue({ + code: 'custom', + path: ['keyAlgorithm'], + message: 'keyAlgorithm is required for private_key_jwt authorization' + }) + } + if (value.mode === 'cross_app_access' && !value.identityProfileId) { + context.addIssue({ + code: 'custom', + path: ['identityProfileId'], + message: 'identityProfileId is required for cross_app_access authorization' + }) + } + }) + +const PublicMcpCommonConfigShape = { + description: PublicMcpDescriptionSchema.optional().default(''), + icon: PublicMcpIconSchema.optional().default('') +} + +const PublicMcpStdioConfigSchema = z + .object({ + ...PublicMcpCommonConfigShape, + type: z.literal('stdio'), + command: PublicMcpCommandSchema, + args: z.array(PublicMcpArgumentSchema).max(256).optional().default([]), + environment: PublicMcpEnvironmentSchema.optional().default({}), + inheritEnv: z.enum(['legacy', 'minimal']).optional().default('minimal'), + customNpmRegistry: PublicMcpSecureUrlSchema.optional() + }) + .strict() + +const PublicMcpSseConfigSchema = z + .object({ + ...PublicMcpCommonConfigShape, + type: z.literal('sse'), + baseUrl: PublicMcpSecureUrlSchema, + headers: PublicMcpHeadersSchema.optional().default({}) + }) + .strict() + +const PublicMcpHttpConfigSchema = z + .object({ + ...PublicMcpCommonConfigShape, + type: z.literal('http'), + baseUrl: PublicMcpSecureUrlSchema, + headers: PublicMcpHeadersSchema.optional().default({}), + authorization: PublicMcpAuthorizationConfigSchema.optional() + }) + .strict() + +export const PublicMcpServerConfigInputSchema = z + .discriminatedUnion('type', [ + PublicMcpStdioConfigSchema, + PublicMcpSseConfigSchema, + PublicMcpHttpConfigSchema + ]) + .refine(isBoundedPublicMcpConfig, { + message: 'Public MCP server configuration exceeds its byte limit' + }) + +export const PublicMcpServerUpdateSchema = z + .object({ + type: z.enum(['stdio', 'sse', 'http']).optional(), + description: PublicMcpDescriptionSchema.optional(), + icon: PublicMcpIconSchema.optional(), + command: PublicMcpCommandSchema.optional(), + args: z.array(PublicMcpArgumentSchema).max(256).optional(), + environment: PublicMcpEnvironmentSchema.optional(), + inheritEnv: z.enum(['legacy', 'minimal']).optional(), + baseUrl: PublicMcpSecureUrlSchema.optional(), + headers: PublicMcpHeadersSchema.optional(), + authorization: PublicMcpAuthorizationConfigSchema.nullable().optional(), + customNpmRegistry: PublicMcpSecureUrlSchema.nullable().optional() + }) + .strict() + .superRefine((value, context) => { + const stdioFields = ['command', 'args', 'environment', 'inheritEnv', 'customNpmRegistry'] + const remoteFields = ['baseUrl', 'headers', 'authorization'] + const hasStdioField = stdioFields.some((field) => Object.hasOwn(value, field)) + const hasRemoteField = remoteFields.some((field) => Object.hasOwn(value, field)) + if (hasStdioField && hasRemoteField) { + context.addIssue({ + code: 'custom', + message: 'MCP update cannot mix stdio and remote transport fields' + }) + } + if (value.type === 'stdio' && hasRemoteField) { + context.addIssue({ + code: 'custom', + message: 'Remote transport fields are not valid for stdio MCP servers' + }) + } + if (value.type !== undefined && value.type !== 'stdio' && hasStdioField) { + context.addIssue({ + code: 'custom', + message: 'Stdio transport fields are not valid for remote MCP servers' + }) + } + if (value.type === 'sse' && Object.hasOwn(value, 'authorization')) { + context.addIssue({ + code: 'custom', + message: 'Authorization settings are only valid for HTTP MCP servers' + }) + } + }) + .refine((value) => Object.keys(value).length > 0, { + message: 'At least one MCP server update is required' + }) + .refine(isBoundedPublicMcpConfig, { + message: 'Public MCP server update exceeds its byte limit' + }) + +export const PublicMcpServerSchema = z + .object({ + name: PublicMcpServerNameSchema, + type: z.enum(['sse', 'stdio', 'inmemory', 'http']), + enabled: z.boolean(), + running: z.boolean().nullable(), + managedBy: z.enum(['deepchat', 'plugin', 'user']), + editable: z.boolean(), + removable: z.boolean(), + description: z.string().max(1024), + commandName: z.string().max(256).nullable(), + endpoint: z + .object({ + origin: z.string().max(4096), + pathPresent: z.boolean() + }) + .strict() + .nullable(), + argumentCount: z.number().int().nonnegative().max(1_000_000), + environmentEntryCount: z.number().int().nonnegative().max(1_000_000), + headerEntryCount: z.number().int().nonnegative().max(1_000_000), + authorizationMode: z + .enum(['none', 'interactive', 'client_credentials', 'private_key_jwt', 'cross_app_access']) + .nullable(), + metadataTruncated: z.boolean() + }) + .strict() + +export const mcpListPublicRoute = defineRouteContract({ + name: 'mcp.listPublic', + input: z.object({}).strict().default({}), + output: z + .object({ + servers: z.array(PublicMcpServerSchema).max(PUBLIC_MCP_LIST_MAX_ITEMS), + truncated: z.boolean() + }) + .strict() +}) + +export const mcpAddPublicRoute = defineRouteContract({ + name: 'mcp.addPublic', + input: z + .object({ + serverName: PublicMcpServerNameSchema, + config: PublicMcpServerConfigInputSchema + }) + .strict(), + output: z.object({ server: PublicMcpServerSchema }).strict() +}) + +export const mcpUpdatePublicRoute = defineRouteContract({ + name: 'mcp.updatePublic', + input: z + .object({ + serverName: PublicMcpServerNameSchema, + updates: PublicMcpServerUpdateSchema + }) + .strict(), + output: z.object({ server: PublicMcpServerSchema }).strict() +}) + +export const mcpSetPublicStatusRoute = defineRouteContract({ + name: 'mcp.setPublicStatus', + input: z + .object({ + serverName: PublicMcpServerNameSchema, + enabled: z.boolean() + }) + .strict(), + output: z.object({ server: PublicMcpServerSchema }).strict() +}) + +export const mcpStartPublicRoute = defineRouteContract({ + name: 'mcp.startPublic', + input: z.object({ serverName: PublicMcpServerNameSchema }).strict(), + output: z.object({ server: PublicMcpServerSchema }).strict() +}) + +export const mcpStopPublicRoute = defineRouteContract({ + name: 'mcp.stopPublic', + input: z.object({ serverName: PublicMcpServerNameSchema }).strict(), + output: z.object({ server: PublicMcpServerSchema }).strict() +}) + +export const mcpRemovePublicRoute = defineRouteContract({ + name: 'mcp.removePublic', + input: z.object({ serverName: PublicMcpServerNameSchema }).strict(), + output: z + .object({ + serverName: PublicMcpServerNameSchema, + removed: z.literal(true) + }) + .strict() +}) + +export type PublicMcpServer = z.infer +export type PublicMcpServerConfigInput = z.infer +export type PublicMcpServerUpdate = z.infer + const McpClientSchema = z.custom() const MCPToolDefinitionSchema = z.custom() const PromptListEntrySchema = z.custom() diff --git a/src/shared/contracts/routes/media.routes.ts b/src/shared/contracts/routes/media.routes.ts new file mode 100644 index 0000000000..e84b657d5c --- /dev/null +++ b/src/shared/contracts/routes/media.routes.ts @@ -0,0 +1,142 @@ +import { z } from 'zod' +import { + IMAGE_GENERATION_MODERATION_VALUES, + IMAGE_GENERATION_OUTPUT_FORMAT_VALUES, + IMAGE_GENERATION_QUALITY_VALUES, + OPENAI_IMAGE_GENERATION_BACKGROUND_VALUES +} from '../../imageGenerationSettings' +import { TTS_RESPONSE_FORMAT_VALUES } from '../../ttsSettings' +import { ArtifactMetadataSchema } from './artifacts.routes' +import { EntityIdSchema, defineRouteContract } from '../common' + +const MediaProviderIdSchema = EntityIdSchema.max(128) +const MediaModelIdSchema = z.string().min(1).max(256) +const MediaPromptSchema = z + .string() + .min(1) + .max(64 * 1024) + .refine((value) => value.trim().length > 0, { message: 'Media input must not be blank' }) + +export const PublicImageGenerationOptionsSchema = z + .object({ + size: z.string().min(1).max(32).optional(), + quality: z.enum(IMAGE_GENERATION_QUALITY_VALUES).optional(), + outputFormat: z.enum(IMAGE_GENERATION_OUTPUT_FORMAT_VALUES).optional(), + outputCompression: z.number().int().min(0).max(100).optional(), + background: z.enum(OPENAI_IMAGE_GENERATION_BACKGROUND_VALUES).optional(), + moderation: z.enum(IMAGE_GENERATION_MODERATION_VALUES).optional() + }) + .strict() + +export const PublicVideoGenerationOptionsSchema = z + .object({ + seconds: z.string().min(1).max(32).optional(), + size: z.string().min(1).max(32).optional(), + ratio: z.string().min(1).max(32).optional(), + duration: z.number().int().min(-1).max(3_600).optional(), + resolution: z.string().min(1).max(32).optional(), + watermark: z.boolean().optional(), + generateAudio: z.boolean().optional() + }) + .strict() + +export const PublicSpeechGenerationOptionsSchema = z + .object({ + voice: z.string().min(1).max(128).optional(), + responseFormat: z.enum(TTS_RESPONSE_FORMAT_VALUES).optional(), + speed: z.number().min(0.25).max(4).optional(), + instructions: z + .string() + .min(1) + .max(16 * 1024) + .optional() + }) + .strict() + +export const MediaGenerationEventSchema = z.discriminatedUnion('type', [ + z + .object({ + type: z.literal('started'), + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema + }) + .strict(), + z + .object({ + type: z.literal('artifact'), + index: z.number().int().nonnegative(), + artifact: ArtifactMetadataSchema + }) + .strict() +]) + +export const imagesGenerateRoute = defineRouteContract({ + name: 'images.generate', + input: z + .object({ + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema, + prompt: MediaPromptSchema, + options: PublicImageGenerationOptionsSchema.optional() + }) + .strict(), + output: z + .object({ + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema, + artifacts: z.array(ArtifactMetadataSchema).min(1).max(8), + requestedOptions: PublicImageGenerationOptionsSchema.optional(), + durationMs: z.number().int().nonnegative() + }) + .strict() +}) + +export const videosGenerateRoute = defineRouteContract({ + name: 'videos.generate', + input: z + .object({ + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema, + prompt: MediaPromptSchema, + options: PublicVideoGenerationOptionsSchema.optional() + }) + .strict(), + output: z + .object({ + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema, + artifacts: z.array(ArtifactMetadataSchema).min(1).max(4), + requestedOptions: PublicVideoGenerationOptionsSchema.optional(), + durationMs: z.number().int().nonnegative() + }) + .strict() +}) + +export const speechGenerateRoute = defineRouteContract({ + name: 'speech.generate', + input: z + .object({ + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema, + text: MediaPromptSchema, + options: PublicSpeechGenerationOptionsSchema.optional() + }) + .strict(), + output: z + .object({ + providerId: MediaProviderIdSchema, + modelId: MediaModelIdSchema, + artifacts: z.array(ArtifactMetadataSchema).length(1), + requestedOptions: PublicSpeechGenerationOptionsSchema.optional(), + durationMs: z.number().int().nonnegative() + }) + .strict() +}) + +export type MediaGenerationEvent = z.infer +export type ImageGenerationInput = z.infer +export type ImageGenerationOutput = z.infer +export type VideoGenerationInput = z.infer +export type VideoGenerationOutput = z.infer +export type SpeechGenerationInput = z.infer +export type SpeechGenerationOutput = z.infer diff --git a/src/shared/contracts/routes/models.routes.ts b/src/shared/contracts/routes/models.routes.ts index ccab8328d9..ff9b359c87 100644 --- a/src/shared/contracts/routes/models.routes.ts +++ b/src/shared/contracts/routes/models.routes.ts @@ -9,6 +9,120 @@ import { } from '../domainSchemas' import { CapabilitySnapshotQuerySchema } from '../../types/model-capabilities' +export const MODEL_INVOKE_MAX_TOTAL_INPUT_CHARACTERS = 4 * 1024 * 1024 +export const MODEL_INVOKE_MAX_OUTPUT_CHARACTERS = 3 * 1024 * 1024 + +export const ModelInvokeUsageSchema = z + .object({ + promptTokens: z.number().int().nonnegative(), + completionTokens: z.number().int().nonnegative(), + totalTokens: z.number().int().nonnegative(), + cachedTokens: z.number().int().nonnegative().optional(), + cacheWriteTokens: z.number().int().nonnegative().optional() + }) + .strict() + +export const ModelInvokeLatencySchema = z + .object({ + queueMs: z.number().int().nonnegative(), + firstEventMs: z.number().int().nonnegative().nullable(), + firstTextMs: z.number().int().nonnegative().nullable(), + totalMs: z.number().int().nonnegative() + }) + .strict() + +export const ModelInvokeProviderFailureSchema = z + .object({ + statusCode: z.number().int().min(100).max(599).optional(), + retryable: z.boolean() + }) + .strict() + +export const ModelInvokeEventSchema = z.discriminatedUnion('type', [ + z.object({ type: z.literal('text_delta'), text: z.string().max(1024 * 1024) }).strict(), + z.object({ type: z.literal('reasoning_delta'), text: z.string().max(1024 * 1024) }).strict(), + z.object({ type: z.literal('usage'), usage: ModelInvokeUsageSchema }).strict(), + z + .object({ + type: z.literal('rate_limit'), + providerId: EntityIdSchema.max(128), + qpsLimit: z.number().nonnegative(), + currentQps: z.number().nonnegative(), + queueLength: z.number().int().nonnegative(), + estimatedWaitTimeMs: z.number().nonnegative().optional() + }) + .strict(), + z + .object({ + type: z.literal('stop'), + reason: z.enum(['tool_use', 'max_tokens', 'max_turn_requests', 'error', 'complete']) + }) + .strict() +]) + +const ModelInvokeMessageSchema = z + .object({ + role: z.enum(['system', 'user', 'assistant']), + content: z + .string() + .min(1) + .max(1024 * 1024) + }) + .strict() + +export const modelsInvokeRoute = defineRouteContract({ + name: 'models.invoke', + input: z + .object({ + providerId: EntityIdSchema.max(128), + modelId: z.string().min(1).max(256), + messages: z.array(ModelInvokeMessageSchema).min(1).max(128), + temperature: z.number().min(0).max(2).optional(), + maxTokens: z.number().int().min(1).max(1_000_000).optional() + }) + .strict() + .superRefine((input, context) => { + const totalCharacters = input.messages.reduce( + (total, message) => total + message.content.length, + 0 + ) + if (totalCharacters > MODEL_INVOKE_MAX_TOTAL_INPUT_CHARACTERS) { + context.addIssue({ + code: 'custom', + message: 'Model invocation input exceeds the total character limit', + path: ['messages'] + }) + } + }), + output: z + .object({ + providerId: EntityIdSchema.max(128), + modelId: z.string().min(1).max(256), + text: z.string().max(MODEL_INVOKE_MAX_OUTPUT_CHARACTERS), + reasoning: z.string().max(MODEL_INVOKE_MAX_OUTPUT_CHARACTERS).optional(), + usage: ModelInvokeUsageSchema.optional(), + finishReason: z.enum(['tool_use', 'max_tokens', 'max_turn_requests', 'error', 'complete']), + latency: ModelInvokeLatencySchema + }) + .strict() + .superRefine((output, context) => { + if ( + output.text.length + (output.reasoning?.length ?? 0) > + MODEL_INVOKE_MAX_OUTPUT_CHARACTERS + ) { + context.addIssue({ + code: 'custom', + message: 'Model invocation output exceeds the total character limit', + path: ['text'] + }) + } + }) +}) + +export type ModelInvokeInput = z.infer +export type ModelInvokeOutput = z.infer +export type ModelInvokeEvent = z.infer + export const modelsGetProviderCatalogRoute = defineRouteContract({ name: 'models.getProviderCatalog', input: z.object({ @@ -94,6 +208,42 @@ export const modelsGetConfigRoute = defineRouteContract({ }) }) +export const PublicModelConfigSchema = ModelConfigSchema.omit({ + conversationId: true, + ownedBy: true +}) + .extend({ + maxTokens: z.number().int().positive().max(Number.MAX_SAFE_INTEGER), + contextLength: z.number().int().positive().max(Number.MAX_SAFE_INTEGER), + maxCompletionTokens: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional() + }) + .strip() + +const PublicModelConfigInputSchema = PublicModelConfigSchema.omit({ isUserDefined: true }).strict() + +export const modelsGetPublicConfigRoute = defineRouteContract({ + name: 'models.getPublicConfig', + input: z + .object({ + modelId: z.string().min(1), + providerId: EntityIdSchema + }) + .strict(), + output: z.object({ config: PublicModelConfigSchema }).strict() +}) + +export const modelsSetPublicConfigRoute = defineRouteContract({ + name: 'models.setPublicConfig', + input: z + .object({ + modelId: z.string().min(1), + providerId: EntityIdSchema, + config: PublicModelConfigInputSchema + }) + .strict(), + output: modelsGetPublicConfigRoute.output +}) + export const modelsSetConfigRoute = defineRouteContract({ name: 'models.setConfig', input: z.object({ diff --git a/src/shared/contracts/routes/ocr.routes.ts b/src/shared/contracts/routes/ocr.routes.ts index d83f57f1e4..5054997671 100644 --- a/src/shared/contracts/routes/ocr.routes.ts +++ b/src/shared/contracts/routes/ocr.routes.ts @@ -1,5 +1,14 @@ import { z } from 'zod' import { defineRouteContract } from '../common' +import { + ATTACHMENT_OCR_MAX_TEXT_CHARACTERS, + ATTACHMENT_PDF_OCR_MAX_PAGE_SPANS, + ATTACHMENT_PDF_OCR_MAX_TOKENS, + PDF_PAGE_COUNT_SANITY_LIMIT +} from '../../types/attachment' +import { ArtifactIdSchema } from './artifacts.routes' + +export const OCR_EXTRACTION_MAX_INPUT_BYTES = 50 * 1024 * 1024 export const OcrBackendSchema = z.enum(['auto', 'cpu']) export const OcrRecognitionStrategySchema = z.enum(['bounded-960', 'tiled-v1']) @@ -25,19 +34,23 @@ const OcrAvailabilitySchema = z.discriminatedUnion('status', [ }) ]) -const OcrEngineStageSchema = z.object({ - providerChain: z.array(z.string()), - precision: z.string() -}) +const OcrEngineStageSchema = z + .object({ + providerChain: z.array(z.string().min(1).max(256)).max(16), + precision: z.string().min(1).max(128) + }) + .strict() -const OcrEngineSchema = z.object({ - coreVersion: z.string(), - modelBundleId: z.string(), - requestedBackend: OcrBackendSchema, - strategy: OcrRecognitionStrategySchema, - detection: OcrEngineStageSchema, - recognition: OcrEngineStageSchema -}) +export const OcrEngineSchema = z + .object({ + coreVersion: z.string().min(1).max(128), + modelBundleId: z.string().min(1).max(256), + requestedBackend: OcrBackendSchema, + strategy: OcrRecognitionStrategySchema, + detection: OcrEngineStageSchema, + recognition: OcrEngineStageSchema + }) + .strict() const OcrProcessSchema = z.object({ state: z.enum(['idle', 'starting', 'ready', 'busy', 'stopping', 'closed']), @@ -77,4 +90,165 @@ export const ocrClearCacheRoute = defineRouteContract({ }) }) +export const OcrInputMimeTypeSchema = z.enum([ + 'application/pdf', + 'image/bmp', + 'image/gif', + 'image/jpeg', + 'image/png', + 'image/tiff', + 'image/webp' +]) + +const OcrExtractionOptionsSchema = z + .object({ + backend: OcrBackendSchema.default('auto'), + sourcePageCountHint: z.number().int().positive().max(PDF_PAGE_COUNT_SANITY_LIMIT).optional(), + generationTokenLimit: z.number().int().positive().max(ATTACHMENT_PDF_OCR_MAX_TOKENS).optional() + }) + .strict() + +export const OcrExtractUploadInputSchema = OcrExtractionOptionsSchema.extend({ + mimeType: OcrInputMimeTypeSchema +}).strict() + +export const OcrExtractArtifactInputSchema = OcrExtractionOptionsSchema.extend({ + artifactId: ArtifactIdSchema +}).strict() + +const OcrPublicTimingSchema = z + .number() + .finite() + .nonnegative() + .max(24 * 60 * 60_000) + +export const OcrBenchmarkSchema = z + .object({ + state: z.enum(['hit', 'miss-warm', 'cold-runtime']), + runtimeStateBefore: z.enum([ + 'not-started', + 'idle', + 'starting', + 'ready', + 'busy', + 'stopping', + 'closed' + ]), + runtimeWasReady: z.boolean(), + inputBytes: z.number().int().positive().max(OCR_EXTRACTION_MAX_INPUT_BYTES), + durationMs: OcrPublicTimingSchema, + appVersion: z.string().min(1).max(128), + protocolVersion: z.literal(1), + surfaceVersion: z.literal(1) + }) + .strict() + .superRefine((benchmark, context) => { + if (benchmark.runtimeWasReady !== (benchmark.runtimeStateBefore === 'ready')) { + context.addIssue({ + code: 'custom', + message: 'OCR runtime readiness does not match its pre-extraction state', + path: ['runtimeWasReady'] + }) + } + const warmRuntime = + benchmark.runtimeStateBefore === 'ready' || benchmark.runtimeStateBefore === 'busy' + if ( + (benchmark.state === 'miss-warm' && !warmRuntime) || + (benchmark.state === 'cold-runtime' && warmRuntime) + ) { + context.addIssue({ + code: 'custom', + message: 'OCR benchmark classification does not match its pre-extraction state', + path: ['state'] + }) + } + }) + +const OcrExtractionCommonSchema = z.object({ + text: z.string().max(ATTACHMENT_OCR_MAX_TEXT_CHARACTERS), + tokenCount: z.number().int().nonnegative().max(ATTACHMENT_PDF_OCR_MAX_TOKENS), + truncated: z.boolean(), + engine: OcrEngineSchema, + cacheHit: z.boolean(), + benchmark: OcrBenchmarkSchema +}) + +const OcrImageExtractionOutputSchema = OcrExtractionCommonSchema.extend({ + kind: z.literal('image'), + mimeType: OcrInputMimeTypeSchema.exclude(['application/pdf']), + imageWidth: z.number().int().positive().max(16_384), + imageHeight: z.number().int().positive().max(16_384), + strategy: OcrRecognitionStrategySchema, + timingMs: z + .object({ + snapshot: OcrPublicTimingSchema, + preprocessing: OcrPublicTimingSchema, + recognition: OcrPublicTimingSchema, + total: OcrPublicTimingSchema + }) + .strict() +}).strict() + +const OcrDocumentPageSpanSchema = z + .object({ + pageNumber: z.number().int().positive().max(PDF_PAGE_COUNT_SANITY_LIMIT), + start: z.number().int().nonnegative().max(ATTACHMENT_OCR_MAX_TEXT_CHARACTERS), + end: z.number().int().nonnegative().max(ATTACHMENT_OCR_MAX_TEXT_CHARACTERS), + complete: z.boolean() + }) + .strict() + +const OcrDocumentExtractionOutputSchema = OcrExtractionCommonSchema.extend({ + kind: z.literal('document'), + mimeType: z.literal('application/pdf'), + pageSpans: z.array(OcrDocumentPageSpanSchema).max(ATTACHMENT_PDF_OCR_MAX_PAGE_SPANS), + artifactTermination: z.enum(['request_complete', 'stopped_by_output_limit', 'resource_limited']), + generationOutputLimitReached: z.boolean(), + generationTokenLimit: z.number().int().positive().max(ATTACHMENT_PDF_OCR_MAX_TOKENS), + emittedPages: z.number().int().nonnegative().max(ATTACHMENT_PDF_OCR_MAX_PAGE_SPANS), + sourcePageCountHint: z.number().int().positive().max(PDF_PAGE_COUNT_SANITY_LIMIT).optional(), + resourceLimit: z + .object({ + code: z.literal('resource_limit_exceeded'), + message: z.string().max(2_048) + }) + .strict() + .optional(), + timingMs: z + .object({ + snapshot: OcrPublicTimingSchema, + recognition: OcrPublicTimingSchema, + total: OcrPublicTimingSchema + }) + .strict() +}).strict() + +export const OcrExtractionOutputSchema = z + .discriminatedUnion('kind', [OcrImageExtractionOutputSchema, OcrDocumentExtractionOutputSchema]) + .superRefine((output, context) => { + if (output.cacheHit !== (output.benchmark.state === 'hit')) { + context.addIssue({ + code: 'custom', + message: 'OCR cache result does not match its benchmark classification', + path: ['benchmark', 'state'] + }) + } + }) + +export const ocrExtractUploadRoute = defineRouteContract({ + name: 'ocr.extractUpload', + input: OcrExtractUploadInputSchema, + output: OcrExtractionOutputSchema +}) + +export const ocrExtractArtifactRoute = defineRouteContract({ + name: 'ocr.extractArtifact', + input: OcrExtractArtifactInputSchema, + output: OcrExtractionOutputSchema +}) + export type OcrRuntimeStatus = z.infer +export type OcrEngine = z.infer +export type OcrExtractUploadInput = z.infer +export type OcrExtractArtifactInput = z.infer +export type OcrExtractionOutput = z.infer diff --git a/src/shared/contracts/routes/providers.routes.ts b/src/shared/contracts/routes/providers.routes.ts index a5aed0d094..6ddb928715 100644 --- a/src/shared/contracts/routes/providers.routes.ts +++ b/src/shared/contracts/routes/providers.routes.ts @@ -1,5 +1,6 @@ import { z } from 'zod' import { EntityIdSchema, ProviderModelSummarySchema, defineRouteContract } from '../common' +import { ModelType } from '../../model' import { AcpDebugActionSchema, AcpDebugRunResultSchema, @@ -13,6 +14,148 @@ import { } from '../domainSchemas' import { PROVIDER_IMPORT_CUSTOM_API_TYPES, PROVIDER_IMPORT_SOURCE_IDS } from '../../providerImport' +export const PROVIDER_CREDENTIAL_MAX_BYTES = 64 * 1024 + +const StoredProviderCredentialSchema = z + .string() + .min(1) + .max(PROVIDER_CREDENTIAL_MAX_BYTES) + .refine((value) => value.trim().length > 0, { message: 'Credential must not be blank' }) + .refine((value) => new TextEncoder().encode(value).byteLength <= PROVIDER_CREDENTIAL_MAX_BYTES, { + message: 'Credential exceeds its UTF-8 byte limit' + }) + +const PublicProviderApiTypeSchema = z.enum(PROVIDER_IMPORT_CUSTOM_API_TYPES) +const PublicProviderBaseUrlSchema = z + .url() + .max(4096) + .superRefine((value, context) => { + let url: URL + try { + url = new URL(value) + } catch { + return + } + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + context.addIssue({ code: 'custom', message: 'Provider URL must use HTTP or HTTPS' }) + } + if (url.username || url.password || url.search || url.hash) { + context.addIssue({ + code: 'custom', + message: 'Provider URL must not contain credentials, query parameters, or a fragment' + }) + } + }) + +export const PublicProviderModelSchema = z + .object({ + id: z.string().min(1).max(256), + name: z.string().max(256), + group: z.string().max(128), + enabled: z.boolean(), + custom: z.boolean(), + vision: z.boolean(), + functionCall: z.boolean(), + reasoning: z.boolean(), + enableSearch: z.boolean(), + type: z.enum(ModelType).optional(), + contextLength: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(), + maxTokens: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional() + }) + .strict() + +export const PublicProviderSchema = z + .object({ + id: EntityIdSchema.max(128), + name: z.string().min(1).max(256), + apiType: z.string().min(1).max(128), + enabled: z.boolean(), + custom: z.boolean(), + storedCredentialConfigured: z.boolean(), + models: z.array(PublicProviderModelSchema).max(10_000) + }) + .strict() + +export const providersListPublicRoute = defineRouteContract({ + name: 'providers.listPublic', + input: z.object({ enabledOnly: z.boolean().optional() }).strict().default({}), + output: z.object({ providers: z.array(PublicProviderSchema).max(1_000) }).strict() +}) + +export const PublicProviderSummarySchema = PublicProviderSchema.omit({ models: true }) + +export const providersAddPublicRoute = defineRouteContract({ + name: 'providers.addPublic', + input: z + .object({ + name: z.string().trim().min(1).max(256), + apiType: PublicProviderApiTypeSchema, + baseUrl: PublicProviderBaseUrlSchema, + enabled: z.boolean().optional().default(true) + }) + .strict(), + output: z.object({ provider: PublicProviderSummarySchema }).strict() +}) + +export const providersUpdatePublicRoute = defineRouteContract({ + name: 'providers.updatePublic', + input: z + .object({ + providerId: EntityIdSchema.max(128), + updates: z + .object({ + name: z.string().trim().min(1).max(256).optional(), + apiType: PublicProviderApiTypeSchema.optional(), + baseUrl: PublicProviderBaseUrlSchema.optional(), + enabled: z.boolean().optional() + }) + .strict() + .refine((updates) => Object.keys(updates).length > 0, { + message: 'At least one provider update is required' + }) + }) + .strict(), + output: z + .object({ + provider: PublicProviderSummarySchema, + requiresRebuild: z.boolean() + }) + .strict() +}) + +export const providersSetCredentialRoute = defineRouteContract({ + name: 'providers.setCredential', + input: z.discriminatedUnion('action', [ + z + .object({ + providerId: EntityIdSchema.max(128), + action: z.literal('set'), + kind: z.literal('api-key'), + value: StoredProviderCredentialSchema + }) + .strict(), + z + .object({ + providerId: EntityIdSchema.max(128), + action: z.literal('clear'), + kind: z.literal('api-key') + }) + .strict() + ]), + output: z + .object({ + providerId: EntityIdSchema.max(128), + action: z.enum(['set', 'clear']), + kind: z.literal('api-key'), + storedApiKeyConfigured: z.boolean() + }) + .strict() +}) + +export type PublicProvider = z.infer +export type PublicProviderModel = z.infer +export type PublicProviderSummary = z.infer + const ProviderImportSourceIdSchema = z.enum(PROVIDER_IMPORT_SOURCE_IDS) const ProviderImportCustomApiTypeSchema = z.enum(PROVIDER_IMPORT_CUSTOM_API_TYPES) const ProviderImportTargetKindSchema = z.enum(['builtin', 'custom', 'unsupported']) @@ -48,6 +191,12 @@ export const providersTestConnectionRoute = defineRouteContract({ }) }) +export const providersTestPublicConnectionRoute = defineRouteContract({ + name: 'providers.testPublicConnection', + input: providersTestConnectionRoute.input, + output: providersTestConnectionRoute.output +}) + export const providersListRoute = defineRouteContract({ name: 'providers.list', input: z.object({}).default({}), diff --git a/src/shared/contracts/routes/runs.routes.ts b/src/shared/contracts/routes/runs.routes.ts new file mode 100644 index 0000000000..142b11e1ea --- /dev/null +++ b/src/shared/contracts/routes/runs.routes.ts @@ -0,0 +1,152 @@ +import { z } from 'zod' +import { + EntityIdSchema, + MessagePageCursorSchema, + SessionStatusSchema, + TimestampMsSchema, + defineRouteContract +} from '../common' +import { LocalControlEventCursorSchema } from '../localControl' + +export const RUN_PROMPT_MAX_CHARACTERS = 256 * 1024 +export const RUN_SYSTEM_PROMPT_MAX_CHARACTERS = 256 * 1024 +export const RUN_MESSAGE_MAX_TEXT_BYTES = 128 * 1024 +export const RUN_MAX_MESSAGE_PAGE_SIZE = 100 + +export const RunIdSchema = EntityIdSchema.max(128) +export const RunEventCursorSchema = LocalControlEventCursorSchema + +const BoundedIdentifierSchema = z.string().trim().min(1).max(256) +const PublicRunMessageTextSchema = z + .string() + .refine((value) => new TextEncoder().encode(value).byteLength <= RUN_MESSAGE_MAX_TEXT_BYTES, { + message: 'Run message text exceeds its UTF-8 byte limit' + }) +const UniqueIdentifierListSchema = z + .array(BoundedIdentifierSchema) + .max(128) + .superRefine((values, context) => { + const seen = new Set() + values.forEach((value, index) => { + if (seen.has(value)) { + context.addIssue({ code: 'custom', message: `Duplicate value: ${value}`, path: [index] }) + } + seen.add(value) + }) + }) + +export const PublicRunMessageSchema = z + .object({ + id: EntityIdSchema, + role: z.enum(['user', 'assistant']), + status: z.enum(['pending', 'sent', 'error']), + text: PublicRunMessageTextSchema, + textTruncated: z.boolean(), + createdAt: TimestampMsSchema, + updatedAt: TimestampMsSchema + }) + .strict() + +export const PublicRunSnapshotSchema = z + .object({ + runId: RunIdSchema, + sessionId: EntityIdSchema, + agentId: EntityIdSchema, + title: z.string(), + status: SessionStatusSchema, + providerId: z.string(), + modelId: z.string(), + createdAt: TimestampMsSchema, + updatedAt: TimestampMsSchema, + messages: z.array(PublicRunMessageSchema).max(RUN_MAX_MESSAGE_PAGE_SIZE), + nextCursor: MessagePageCursorSchema.nullable(), + hasMore: z.boolean() + }) + .strict() + +export const sessionsRunDetachedRoute = defineRouteContract({ + name: 'sessions.runDetached', + input: z + .object({ + prompt: z + .string() + .min(1) + .max(RUN_PROMPT_MAX_CHARACTERS) + .refine((value) => value.trim().length > 0, { message: 'Prompt must not be blank' }), + agentId: BoundedIdentifierSchema.optional(), + title: z.string().trim().min(1).max(512).optional(), + projectDir: z + .string() + .trim() + .min(1) + .max(4096) + .refine((value) => !value.includes('\0'), { message: 'Project directory contains NUL' }) + .optional(), + providerId: BoundedIdentifierSchema.optional(), + modelId: BoundedIdentifierSchema.optional(), + systemPrompt: z.string().max(RUN_SYSTEM_PROMPT_MAX_CHARACTERS).optional(), + activeSkills: UniqueIdentifierListSchema.optional(), + disabledAgentTools: UniqueIdentifierListSchema.optional(), + maxTurns: z.number().int().min(1).max(100).optional() + }) + .strict(), + output: z + .object({ + runId: RunIdSchema, + sessionId: EntityIdSchema, + status: SessionStatusSchema, + requestId: EntityIdSchema.nullable(), + messageId: EntityIdSchema.nullable(), + createdAt: TimestampMsSchema + }) + .strict() +}) + +export const runsGetRoute = defineRouteContract({ + name: 'runs.get', + input: z + .object({ + runId: RunIdSchema, + cursor: MessagePageCursorSchema.nullable().optional(), + limit: z.number().int().positive().max(RUN_MAX_MESSAGE_PAGE_SIZE).optional() + }) + .strict(), + output: PublicRunSnapshotSchema +}) + +export const runsCancelRoute = defineRouteContract({ + name: 'runs.cancel', + input: z.object({ runId: RunIdSchema }).strict(), + output: z + .object({ + runId: RunIdSchema, + cancelRequested: z.boolean(), + status: SessionStatusSchema + }) + .strict() +}) + +export const eventsSubscribeRoute = defineRouteContract({ + name: 'events.subscribe', + input: z + .object({ + runId: RunIdSchema, + cursor: RunEventCursorSchema.optional(), + messageLimit: z.number().int().positive().max(RUN_MAX_MESSAGE_PAGE_SIZE).optional() + }) + .strict(), + output: z + .object({ + runId: RunIdSchema, + lastCursor: RunEventCursorSchema + }) + .strict() +}) + +export type PublicRunMessage = z.infer +export type PublicRunSnapshot = z.infer +export type RunDetachedInput = z.infer +export type RunDetachedOutput = z.infer +export type RunGetInput = z.infer +export type RunCancelInput = z.infer +export type EventsSubscribeInput = z.infer diff --git a/src/shared/contracts/routes/settings.routes.ts b/src/shared/contracts/routes/settings.routes.ts index 91b22a6967..ad49b7d4d6 100644 --- a/src/shared/contracts/routes/settings.routes.ts +++ b/src/shared/contracts/routes/settings.routes.ts @@ -147,6 +147,22 @@ export const settingsUpdateRoute = defineRouteContract({ }) }) +export const settingsGetPublicRoute = defineRouteContract({ + name: 'settings.getPublic', + input: settingsGetSnapshotRoute.input, + output: settingsGetSnapshotRoute.output +}) + +export const settingsUpdatePublicRoute = defineRouteContract({ + name: 'settings.updatePublic', + input: z + .object({ + changes: z.array(SettingsChangeSchema).length(1) + }) + .strict(), + output: settingsUpdateRoute.output +}) + export const SettingsActivityCategorySchema = z.enum([ 'provider', 'model', diff --git a/src/shared/contracts/routes/skills.routes.ts b/src/shared/contracts/routes/skills.routes.ts index 79ef2bf607..5557ec14f6 100644 --- a/src/shared/contracts/routes/skills.routes.ts +++ b/src/shared/contracts/routes/skills.routes.ts @@ -19,6 +19,149 @@ import type { } from '@shared/types/agentSkillImport' import { EntityIdSchema, defineRouteContract } from '../common' +export const PUBLIC_SKILL_LIST_MAX_ITEMS = 512 + +export const PublicSkillAgentIdSchema = z + .string() + .trim() + .min(1) + .max(255) + .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/) + .refine((value) => !value.includes('..'), { message: 'Agent ID must not contain ..' }) + +export const PublicSkillNameSchema = z + .string() + .trim() + .min(1) + .max(255) + .regex(/^[a-z0-9][a-z0-9._-]*$/) + +export const PublicSkillSchema = z + .object({ + agentId: PublicSkillAgentIdSchema, + name: PublicSkillNameSchema, + description: z.string().max(1024), + category: z.string().max(128).nullable(), + platforms: z.array(z.string().min(1).max(64)).max(32), + allowedTools: z.array(z.string().min(1).max(128)).max(32), + sourceType: z.enum([ + 'builtin', + 'created', + 'folder-install', + 'zip-install', + 'url-install', + 'git-install', + 'adopted', + 'imported' + ]), + enabled: z.boolean(), + mutable: z.boolean(), + managedBy: z.enum(['deepchat', 'plugin', 'user']), + metadataTruncated: z.boolean() + }) + .strict() + +const PublicSkillAgentScopeSchema = z + .object({ + agentId: PublicSkillAgentIdSchema.optional().default('deepchat') + }) + .strict() + +const PublicSkillArchiveFilenameSchema = z + .string() + .trim() + .min(1) + .max(255) + .refine( + (value) => value !== '.' && value !== '..' && !value.includes('/') && !value.includes('\\'), + { message: 'Archive filename must be a basename' } + ) + .refine( + (value) => + !/[\u0000-\u001f\u007f-\u009f\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/.test(value), + { message: 'Archive filename contains unsafe display characters' } + ) + +const PublicSkillUrlSchema = z + .url() + .max(8192) + .superRefine((value, context) => { + const url = new URL(value) + if (url.protocol !== 'https:') { + context.addIssue({ code: 'custom', message: 'Skill URL must use HTTPS' }) + } + if (url.username || url.password || url.hash) { + context.addIssue({ + code: 'custom', + message: 'Skill URL must not contain credentials or a fragment' + }) + } + }) + +export const skillsListPublicRoute = defineRouteContract({ + name: 'skills.listPublic', + input: PublicSkillAgentScopeSchema, + output: z + .object({ + skills: z.array(PublicSkillSchema).max(PUBLIC_SKILL_LIST_MAX_ITEMS), + truncated: z.boolean() + }) + .strict() +}) + +export const skillsInstallPublicUrlRoute = defineRouteContract({ + name: 'skills.installPublicUrl', + input: PublicSkillAgentScopeSchema.extend({ + url: PublicSkillUrlSchema, + overwrite: z.boolean().optional().default(false) + }), + output: z + .object({ + agentId: PublicSkillAgentIdSchema, + name: PublicSkillNameSchema, + installed: z.literal(true) + }) + .strict() +}) + +export const skillsInstallUploadRoute = defineRouteContract({ + name: 'skills.installUpload', + input: PublicSkillAgentScopeSchema.extend({ + filename: PublicSkillArchiveFilenameSchema, + overwrite: z.boolean().optional().default(false) + }), + output: skillsInstallPublicUrlRoute.output +}) + +export const skillsSetPublicStatusRoute = defineRouteContract({ + name: 'skills.setPublicStatus', + input: PublicSkillAgentScopeSchema.extend({ + name: PublicSkillNameSchema, + enabled: z.boolean() + }), + output: z + .object({ + agentId: PublicSkillAgentIdSchema, + name: PublicSkillNameSchema, + enabled: z.boolean() + }) + .strict() +}) + +export const skillsUninstallPublicRoute = defineRouteContract({ + name: 'skills.uninstallPublic', + input: PublicSkillAgentScopeSchema.extend({ name: PublicSkillNameSchema }), + output: z + .object({ + agentId: PublicSkillAgentIdSchema, + name: PublicSkillNameSchema, + removed: z.literal(true) + }) + .strict() +}) + +export type PublicSkill = z.infer + const SkillMetadataSchema = z.custom() const UnifiedSkillItemSchema = z.custom() const SkillInstallOptionsSchema = z.custom().optional() diff --git a/src/shared/types/agent-interface.d.ts b/src/shared/types/agent-interface.d.ts index bffeab9c5e..b10c6cef2e 100644 --- a/src/shared/types/agent-interface.d.ts +++ b/src/shared/types/agent-interface.d.ts @@ -829,12 +829,16 @@ export interface CreateDetachedSessionInput { metadata?: SessionMetadata | null } -export type SessionMetadata = { - source: 'cron_job' - cronJobId: string - cronJobRunId: string - scheduledAt: number -} +export type SessionMetadata = + | { + source: 'cron_job' + cronJobId: string + cronJobRunId: string + scheduledAt: number + } + | { + source: 'cli_run' + } // ---- Project Types ---- diff --git a/src/shared/types/provider.ts b/src/shared/types/provider.ts index f3240c629d..9a0b0acc6b 100644 --- a/src/shared/types/provider.ts +++ b/src/shared/types/provider.ts @@ -143,6 +143,13 @@ export type StandaloneVideoGenerationResult = { videos: Array<{ data: string; mimeType: string }> } +export type StandaloneSpeechGenerationResult = { + providerId: string + modelId: string + options?: TtsSettings + audio: { data: string; mimeType: string } +} + export interface KeyStatus { remainNum?: number /** Remaining quota */ @@ -358,6 +365,14 @@ export interface ProviderRuntimePort { videoOptions?: VideoGenerationOptions, options?: { signal?: AbortSignal } ): Promise + + generateSpeechStandalone( + providerId: string, + text: string, + modelId: string, + speechOptions?: TtsSettings, + options?: { signal?: AbortSignal } + ): Promise } export type ProviderExecutionPort = Pick< diff --git a/src/shared/types/skill.ts b/src/shared/types/skill.ts index 24779f0ce7..c69fed8573 100644 --- a/src/shared/types/skill.ts +++ b/src/shared/types/skill.ts @@ -12,6 +12,8 @@ import type { UnifiedSkillItem } from './skillManagement' +export const SKILL_ARCHIVE_MAX_INPUT_BYTES = 200 * 1024 * 1024 + /** * Skill metadata extracted from SKILL.md frontmatter. * Always kept in memory for quick access and semantic matching. @@ -35,6 +37,8 @@ export interface SkillMetadata { allowedTools?: string[] /** Plugin owner id when the skill is contributed by a plugin */ ownerPluginId?: string + /** DeepChat-owned resource exposed read-only without copying into an Agent Skill root */ + readOnly?: boolean } /** diff --git a/src/shared/utils/filesystem.ts b/src/shared/utils/filesystem.ts new file mode 100644 index 0000000000..c6408c1c8d --- /dev/null +++ b/src/shared/utils/filesystem.ts @@ -0,0 +1,16 @@ +const HARDLINK_UNAVAILABLE_CODES = new Set([ + 'EACCES', + 'EINVAL', + 'EMLINK', + 'ENOSYS', + 'ENOTSUP', + 'EOPNOTSUPP', + 'EPERM', + 'EXDEV' +]) + +export function isHardlinkUnavailableError(error: unknown): boolean { + if (typeof error !== 'object' || error === null) return false + const code = (error as NodeJS.ErrnoException).code + return typeof code === 'string' && HARDLINK_UNAVAILABLE_CODES.has(code) +} diff --git a/test/main/app/applicationDataReset.test.ts b/test/main/app/applicationDataReset.test.ts new file mode 100644 index 0000000000..8b7cc2c88b --- /dev/null +++ b/test/main/app/applicationDataReset.test.ts @@ -0,0 +1,141 @@ +import { describe, expect, it, vi } from 'vitest' +import { + coordinateApplicationDataReset, + type ApplicationDataResetDependencies +} from '@/app/applicationDataReset' +import type { CliLauncherStatus } from '@/cli/launcherService' + +const INSTALLED_STATUS: CliLauncherStatus = { + state: 'installed', + reason: null, + commandPath: '/home/user/.local/bin/deepchat', + shellConfigPath: '/home/user/.profile' +} + +function createDependencies( + status: CliLauncherStatus = INSTALLED_STATUS +): ApplicationDataResetDependencies & { + cliLauncher: { + getStatus: ReturnType + removeOwnedLauncher: ReturnType + } + logger: { warn: ReturnType } + stop: ReturnType + resetDataByType: ReturnType +} { + return { + cliLauncher: { + getStatus: vi.fn().mockResolvedValue(status), + removeOwnedLauncher: vi.fn().mockResolvedValue({ + ...status, + state: 'not-installed', + reason: null + }) + }, + logger: { warn: vi.fn() }, + stop: vi.fn().mockResolvedValue(undefined), + resetDataByType: vi.fn().mockResolvedValue(undefined) + } +} + +describe('coordinateApplicationDataReset', () => { + it('stops runtimes before removing an owned launcher and resetting all data', async () => { + const dependencies = createDependencies() + + await coordinateApplicationDataReset('all', dependencies) + + expect(dependencies.stop).toHaveBeenCalledOnce() + expect(dependencies.cliLauncher.getStatus).toHaveBeenCalledOnce() + expect(dependencies.cliLauncher.removeOwnedLauncher).toHaveBeenCalledOnce() + expect(dependencies.resetDataByType).toHaveBeenCalledWith('all') + expect(dependencies.stop.mock.invocationCallOrder[0]).toBeLessThan( + dependencies.cliLauncher.getStatus.mock.invocationCallOrder[0] + ) + expect(dependencies.cliLauncher.removeOwnedLauncher.mock.invocationCallOrder[0]).toBeLessThan( + dependencies.resetDataByType.mock.invocationCallOrder[0] + ) + }) + + it('preserves a conflicting launcher without blocking a full data reset', async () => { + const dependencies = createDependencies({ + ...INSTALLED_STATUS, + state: 'conflict', + reason: 'command-modified' + }) + + await expect(coordinateApplicationDataReset('all', dependencies)).resolves.toBeUndefined() + + expect(dependencies.cliLauncher.removeOwnedLauncher).not.toHaveBeenCalled() + expect(dependencies.logger.warn).toHaveBeenCalledWith( + '[CLI] Launcher cleanup did not complete during full data reset', + { reason: 'command-modified' } + ) + expect(dependencies.resetDataByType).toHaveBeenCalledWith('all') + }) + + it('continues resetting when launcher inspection or removal fails', async () => { + const inspectionFailure = createDependencies() + inspectionFailure.cliLauncher.getStatus.mockRejectedValueOnce( + Object.assign(new Error('sensitive path'), { code: 'EACCES' }) + ) + + await coordinateApplicationDataReset('all', inspectionFailure) + + expect(inspectionFailure.cliLauncher.removeOwnedLauncher).not.toHaveBeenCalled() + expect(inspectionFailure.logger.warn).toHaveBeenCalledWith( + '[CLI] Launcher cleanup did not complete during full data reset', + { reason: 'status-inspection-failed', errorCode: 'EACCES' } + ) + expect(JSON.stringify(inspectionFailure.logger.warn.mock.calls[0])).not.toContain( + 'sensitive path' + ) + expect(inspectionFailure.resetDataByType).toHaveBeenCalledWith('all') + + const removalFailure = createDependencies() + removalFailure.cliLauncher.removeOwnedLauncher.mockRejectedValueOnce( + Object.assign(new Error('sensitive path'), { code: 'EPERM' }) + ) + + await coordinateApplicationDataReset('all', removalFailure) + + expect(removalFailure.logger.warn).toHaveBeenCalledWith( + '[CLI] Launcher cleanup did not complete during full data reset', + { reason: 'launcher-removal-failed', errorCode: 'EPERM' } + ) + expect(removalFailure.resetDataByType).toHaveBeenCalledWith('all') + }) + + it('does not let diagnostic failures block reset and stops before touching reset state', async () => { + const diagnosticFailure = createDependencies({ + ...INSTALLED_STATUS, + state: 'conflict', + reason: 'ownership-marker-invalid' + }) + diagnosticFailure.logger.warn.mockImplementationOnce(() => { + throw new Error('logger unavailable') + }) + + await expect(coordinateApplicationDataReset('all', diagnosticFailure)).resolves.toBeUndefined() + expect(diagnosticFailure.resetDataByType).toHaveBeenCalledWith('all') + + const stopFailure = createDependencies() + stopFailure.stop.mockRejectedValueOnce(new Error('shutdown failed')) + + await expect(coordinateApplicationDataReset('all', stopFailure)).rejects.toThrow( + 'shutdown failed' + ) + expect(stopFailure.cliLauncher.getStatus).not.toHaveBeenCalled() + expect(stopFailure.cliLauncher.removeOwnedLauncher).not.toHaveBeenCalled() + expect(stopFailure.resetDataByType).not.toHaveBeenCalled() + }) + + it('does not inspect or remove the launcher for partial resets', async () => { + const dependencies = createDependencies() + + await coordinateApplicationDataReset('chat', dependencies) + + expect(dependencies.cliLauncher.getStatus).not.toHaveBeenCalled() + expect(dependencies.cliLauncher.removeOwnedLauncher).not.toHaveBeenCalled() + expect(dependencies.resetDataByType).toHaveBeenCalledWith('chat') + }) +}) diff --git a/test/main/app/routes.test.ts b/test/main/app/routes.test.ts index e5483c0a68..2dceecdf1a 100644 --- a/test/main/app/routes.test.ts +++ b/test/main/app/routes.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' +import { createRendererRouteContext } from '@/routes/routeRegistry' import { app } from 'electron' import { debugCloseSplashScenarioRoute, @@ -63,10 +64,10 @@ describe('app debug splash routes', () => { const show = routes.get(debugShowSplashScenarioRoute.name) const close = routes.get(debugCloseSplashScenarioRoute.name) - await expect(show?.({ mode: 'unlock' }, { webContentsId: 1, windowId: 1 })).resolves.toEqual({ + await expect(show?.({ mode: 'unlock' }, createRendererRouteContext(1, 1))).resolves.toEqual({ shown: false }) - await expect(close?.({}, { webContentsId: 1, windowId: 1 })).resolves.toEqual({ + await expect(close?.({}, createRendererRouteContext(1, 1))).resolves.toEqual({ closed: false }) expect(splash.showDebugScenario).not.toHaveBeenCalled() @@ -85,13 +86,13 @@ describe('app debug splash routes', () => { const show = routes.get(debugShowSplashScenarioRoute.name) const close = routes.get(debugCloseSplashScenarioRoute.name) - await expect(show?.({ mode: 'unlock' }, { webContentsId: 1, windowId: 1 })).resolves.toEqual({ + await expect(show?.({ mode: 'unlock' }, createRendererRouteContext(1, 1))).resolves.toEqual({ shown: true }) expect(splash.showDebugScenario).toHaveBeenCalledWith('unlock') - await expect(close?.({}, { webContentsId: 1, windowId: 1 })).resolves.toEqual({ closed: true }) + await expect(close?.({}, createRendererRouteContext(1, 1))).resolves.toEqual({ closed: true }) expect(splash.closeDebugScenario).toHaveBeenCalledTimes(1) - await expect(show?.({ mode: 'invalid' }, { webContentsId: 1, windowId: 1 })).rejects.toThrow() + await expect(show?.({ mode: 'invalid' }, createRendererRouteContext(1, 1))).rejects.toThrow() }) }) @@ -101,7 +102,7 @@ describe('app performance diagnostics route', () => { const routes = createRoutes({ rendererPerformance }) const handler = routes.get(performanceRecordRendererRoute.name) - await expect(handler?.(validRecord, { webContentsId: 1, windowId: 1 })).resolves.toEqual({ + await expect(handler?.(validRecord, createRendererRouteContext(1, 1))).resolves.toEqual({ accepted: true }) expect(rendererPerformance.record).toHaveBeenCalledWith(validRecord) @@ -115,7 +116,7 @@ describe('app performance diagnostics route', () => { }) const handler = routes.get(performanceRecordRendererRoute.name) - await expect(handler?.(validRecord, { webContentsId: 2, windowId: 2 })).resolves.toEqual({ + await expect(handler?.(validRecord, createRendererRouteContext(2, 2))).resolves.toEqual({ accepted: false }) expect(rendererPerformance.record).not.toHaveBeenCalled() @@ -128,7 +129,7 @@ describe('app performance diagnostics route', () => { await expect( handler?.( { ...validRecord, metadata: { sessionId: 'sensitive' } }, - { webContentsId: 1, windowId: 1 } + createRendererRouteContext(1, 1) ) ).rejects.toThrow() }) diff --git a/test/main/approval/approvalBroker.test.ts b/test/main/approval/approvalBroker.test.ts new file mode 100644 index 0000000000..0bc3a7eef9 --- /dev/null +++ b/test/main/approval/approvalBroker.test.ts @@ -0,0 +1,207 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import { ApprovalBroker, ApprovalCapacityError, type ApprovalEvent } from '@/approval' + +const binding = (argumentsValue: unknown, scopeKey = 'scope-1') => ({ + domain: 'test', + scopeKey, + operation: 'resource.update', + effect: 'write', + bindingKey: 'resource-1', + arguments: argumentsValue, + metadata: { privateValue: 'metadata-secret' } +}) + +afterEach(() => { + vi.useRealTimers() +}) + +describe('ApprovalBroker', () => { + it('deduplicates canonical pending bindings and consumes approval exactly once', () => { + const broker = new ApprovalBroker() + const first = broker.create(binding({ z: 1, a: 2 }), { + deduplicatePending: true, + includeArgumentsPreview: true + }) + const second = broker.create(binding({ a: 2, z: 1 }), { + deduplicatePending: true, + includeArgumentsPreview: true + }) + + expect(second.requestId).toBe(first.requestId) + expect(first.argumentsPreview).toBe('{"a":2,"z":1}') + expect( + broker.resolve({ + requestId: first.requestId, + scopeKey: first.scopeKey, + decision: 'approved' + }) + ).toBe(true) + + const match = { + domain: first.domain, + scopeKey: first.scopeKey, + operation: first.operation, + effect: first.effect, + bindingKey: 'resource-1', + arguments: { a: 2, z: 1 } + } + expect(broker.consumeApproved(match)).toBe(true) + expect(broker.consumeApproved(match)).toBe(false) + }) + + it('keeps identical non-deduplicated approvals isolated', () => { + const broker = new ApprovalBroker() + const first = broker.create(binding({ value: 1 })) + const second = broker.create(binding({ value: 1 })) + + expect(first.requestId).not.toBe(second.requestId) + expect( + broker.resolve({ + requestId: first.requestId, + scopeKey: first.scopeKey, + decision: 'approved' + }) + ).toBe(true) + expect( + broker.consumeApproved({ + requestId: second.requestId, + domain: second.domain, + scopeKey: second.scopeKey, + operation: second.operation, + effect: second.effect, + bindingKey: 'resource-1', + arguments: { value: 1 } + }) + ).toBe(false) + broker.clear() + }) + + it('settles every waiter before removing consume-on-approve entries', async () => { + const broker = new ApprovalBroker() + const first = broker.create(binding({ value: 1 }), { + deduplicatePending: true, + consumeOnApprove: true + }) + const second = broker.create(binding({ value: 1 }), { + deduplicatePending: true, + consumeOnApprove: true + }) + const firstDecision = broker.wait(first.requestId) + const secondDecision = broker.wait(second.requestId) + + expect( + broker.resolve({ + requestId: first.requestId, + scopeKey: first.scopeKey, + decision: 'approved' + }) + ).toBe(true) + await expect(firstDecision).resolves.toEqual({ allowed: true }) + await expect(secondDecision).resolves.toEqual({ allowed: true }) + expect( + broker.resolve({ + requestId: first.requestId, + scopeKey: first.scopeKey, + decision: 'approved' + }) + ).toBe(false) + }) + + it('settles timeout and abort without leaving resolvable requests', async () => { + vi.useFakeTimers() + const broker = new ApprovalBroker({ defaultTimeoutMs: 50 }) + const timed = broker.create(binding({ value: 1 })) + const timedDecision = broker.wait(timed.requestId) + await vi.advanceTimersByTimeAsync(50) + await expect(timedDecision).resolves.toEqual({ allowed: false, reason: 'timeout' }) + + const controller = new AbortController() + const aborted = broker.create(binding({ value: 2 })) + const abortedDecision = broker.wait(aborted.requestId, controller.signal) + controller.abort() + await expect(abortedDecision).resolves.toEqual({ allowed: false, reason: 'cancelled' }) + expect( + broker.resolve({ + requestId: aborted.requestId, + scopeKey: aborted.scopeKey, + decision: 'approved' + }) + ).toBe(false) + }) + + it('cancels only the selected scope and enforces its pending limit', async () => { + const broker = new ApprovalBroker({ maxPendingPerScope: 1 }) + const first = broker.create(binding({ value: 1 }, 'scope-a')) + const other = broker.create(binding({ value: 1 }, 'scope-b')) + const firstDecision = broker.wait(first.requestId) + + expect(() => broker.create(binding({ value: 2 }, 'scope-a'))).toThrow(ApprovalCapacityError) + broker.cancelScope('scope-a') + await expect(firstDecision).resolves.toEqual({ allowed: false, reason: 'cancelled' }) + expect( + broker.resolve({ + requestId: other.requestId, + scopeKey: other.scopeKey, + decision: 'approved' + }) + ).toBe(true) + broker.clear() + }) + + it('clears one adapter domain without cancelling another', async () => { + const broker = new ApprovalBroker() + const tool = broker.create(binding({ value: 1 })) + const cli = broker.create({ + ...binding({ value: 1 }), + domain: 'cli-mutation', + bindingKey: 'cli-request-1' + }) + const toolDecision = broker.wait(tool.requestId) + const cliDecision = broker.wait(cli.requestId) + + broker.clearDomain('test') + await expect(toolDecision).resolves.toEqual({ allowed: false, reason: 'cancelled' }) + expect( + broker.resolve({ + requestId: cli.requestId, + scopeKey: cli.scopeKey, + decision: 'approved' + }) + ).toBe(true) + await expect(cliDecision).resolves.toEqual({ allowed: true }) + broker.clear() + }) + + it('publishes only explicitly redacted display data', async () => { + const broker = new ApprovalBroker() + const events: ApprovalEvent[] = [] + broker.subscribe((event) => events.push(event)) + const pending = broker.create({ + ...binding({ credential: 'argument-secret' }), + redactedDisplayData: { title: 'Update provider credential', providerId: 'provider-1' } + }) + await Promise.resolve() + + const serializedEvent = JSON.stringify(events[0]) + expect(serializedEvent).toContain('Update provider credential') + expect(serializedEvent).not.toContain('argument-secret') + expect(serializedEvent).not.toContain('metadata-secret') + expect(events[0]).toMatchObject({ + type: 'created', + approval: { + requestId: pending.requestId, + argumentsHash: expect.stringMatching(/^[a-f0-9]{64}$/) + } + }) + expect(events[0]?.approval).not.toHaveProperty('argumentsPreview') + broker.clear() + }) + + it('rejects cyclic arguments before allocating a request', () => { + const broker = new ApprovalBroker() + const cyclic: Record = {} + cyclic.self = cyclic + + expect(() => broker.create(binding(cyclic))).toThrow('must not contain cycles') + }) +}) diff --git a/test/main/approval/routes.test.ts b/test/main/approval/routes.test.ts new file mode 100644 index 0000000000..eeb41771bf --- /dev/null +++ b/test/main/approval/routes.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it, vi } from 'vitest' +import { approvalsResolveRoute } from '@shared/contracts/routes' +import { createApprovalRoutes } from '@/approval' + +describe('approval routes', () => { + it('passes a validated decision and renderer identity to the resolver', async () => { + const resolve = vi.fn(() => true) + const routes = createApprovalRoutes({ resolve }) + const handler = routes.get(approvalsResolveRoute.name)! + + await expect( + handler( + { requestId: 'approval-request-1234', decision: 'approved' }, + { caller: { kind: 'renderer', webContentsId: 12, windowId: 3 } } + ) + ).resolves.toEqual({ accepted: true }) + expect(resolve).toHaveBeenCalledWith( + { requestId: 'approval-request-1234', decision: 'approved' }, + { kind: 'renderer', webContentsId: 12, windowId: 3 } + ) + }) + + it('rejects CLI callers before resolution', async () => { + const resolve = vi.fn(() => true) + const routes = createApprovalRoutes({ resolve }) + const handler = routes.get(approvalsResolveRoute.name)! + + await expect( + handler( + { requestId: 'approval-request-1234', decision: 'denied' }, + { + caller: { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: [] + } + } + ) + ).rejects.toThrow('Route requires a renderer caller') + expect(resolve).not.toHaveBeenCalled() + }) +}) diff --git a/test/main/cli/agentCommandAccess.test.ts b/test/main/cli/agentCommandAccess.test.ts new file mode 100644 index 0000000000..feb08b0bfd --- /dev/null +++ b/test/main/cli/agentCommandAccess.test.ts @@ -0,0 +1,210 @@ +import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { LOCAL_CONTROL_AGENT_TOKEN_ENV } from '@shared/contracts/localControl' +import { AgentCliCommandAccess, resolveBundledCliDirectory } from '@/cli/agentCommandAccess' +import { AgentCliTokenAuthority } from '@/cli/agentTokenAuthority' +import { CommandPermissionService } from '@/tool/permission/commandPermissionService' + +const temporaryDirectories: string[] = [] + +async function createCliDirectory(platform: NodeJS.Platform = 'darwin') { + const root = await mkdtemp(path.join(os.tmpdir(), 'deepchat-agent-cli-')) + temporaryDirectories.push(root) + const directory = path.join(root, 'out', 'cli') + await mkdir(directory, { recursive: true }) + await writeFile(path.join(directory, platform === 'win32' ? 'deepchat.cmd' : 'deepchat'), '') + return { root, directory } +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('AgentCliCommandAccess', () => { + it('issues one scoped call only for a standalone two-token CLI command', async () => { + const { directory } = await createCliDirectory() + const agentToken = 'a'.repeat(43) + const authority = new AgentCliTokenAuthority({ + now: () => 1_000, + createToken: () => agentToken, + createTokenId: () => 'token-id-conversation-1' + }) + const access = new AgentCliCommandAccess({ + tokenAuthority: authority, + commandPermission: new CommandPermissionService(), + resolveCliDirectory: () => directory + }) + + const environment = access.createEnvironment( + ' conversation-1 ', + 'deepchat model invoke --prompt hello --jsonl' + ) + + expect(environment).toEqual({ + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: agentToken }, + prependPath: [directory], + preserveCommand: true + }) + const first = authority.beginRequest(agentToken) + expect(first.status).toBe('granted') + if (first.status !== 'granted') throw new Error('Expected Agent CLI grant') + expect(first.grant.claims).toMatchObject({ + conversationId: 'conversation-1', + expiresAt: 301_000, + scopes: ['models:invoke'] + }) + first.grant.release() + expect(authority.beginRequest(agentToken)).toEqual({ status: 'quota-exhausted' }) + }) + + it.each([ + 'deepchat --json model invoke', + 'deepchat model', + 'deepchat run watch --run conversation-1', + 'deepchat provider remove --provider provider-1', + 'deepchat unknown command', + 'deepchat model invoke > output.txt', + 'deepchat model invoke | tee output.txt', + 'FOO=bar deepchat model invoke', + `deepchat model invoke --prompt $${LOCAL_CONTROL_AGENT_TOKEN_ENV}` + ])('blocks human-token fallback without issuing authority for %j', async (command) => { + const { directory } = await createCliDirectory() + const authority = new AgentCliTokenAuthority() + const access = new AgentCliCommandAccess({ + tokenAuthority: authority, + commandPermission: new CommandPermissionService(), + resolveCliDirectory: () => directory + }) + + expect(access.createEnvironment('conversation-1', command)).toEqual({ + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: [], + preserveCommand: true + }) + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) + + it('marks non-CLI commands as unprivileged without suppressing command rewriting', async () => { + const { directory } = await createCliDirectory() + const authority = new AgentCliTokenAuthority() + const access = new AgentCliCommandAccess({ + tokenAuthority: authority, + commandPermission: new CommandPermissionService(), + resolveCliDirectory: () => directory + }) + + expect(access.createEnvironment('conversation-1', 'ls -la')).toEqual({ + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: [], + preserveCommand: false + }) + expect(access.createEnvironment('conversation-1', '"deepchat" model invoke')).toEqual({ + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: [], + preserveCommand: false + }) + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) + + it('resolves local help through the bundled launcher without granting authority', async () => { + const { directory } = await createCliDirectory() + const authority = new AgentCliTokenAuthority() + const access = new AgentCliCommandAccess({ + tokenAuthority: authority, + commandPermission: new CommandPermissionService(), + resolveCliDirectory: () => directory + }) + + expect(access.createEnvironment('conversation-1', 'deepchat help')).toEqual({ + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: [directory], + preserveCommand: true + }) + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) + + it('derives dynamic artifact command scopes from the Agent surface', async () => { + const { directory } = await createCliDirectory() + const agentToken = 'b'.repeat(43) + const authority = new AgentCliTokenAuthority({ + createToken: () => agentToken, + createTokenId: () => 'token-id-conversation-1' + }) + const access = new AgentCliCommandAccess({ + tokenAuthority: authority, + commandPermission: new CommandPermissionService(), + resolveCliDirectory: () => directory + }) + + expect( + access.createEnvironment( + 'conversation-1', + 'deepchat audio transcribe --artifact artifact-1 --provider p --model m' + ) + ).toMatchObject({ variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: agentToken } }) + const request = authority.beginRequest(agentToken) + expect(request.status).toBe('granted') + if (request.status !== 'granted') throw new Error('Expected Agent CLI grant') + expect(request.grant.claims.scopes).toEqual(['audio:transcribe', 'artifacts:read']) + request.grant.release() + }) + + it('fails closed without a built launcher', () => { + const authority = new AgentCliTokenAuthority() + const access = new AgentCliCommandAccess({ + tokenAuthority: authority, + commandPermission: new CommandPermissionService(), + resolveCliDirectory: () => null + }) + + expect(access.createEnvironment('conversation-1', 'deepchat system status')).toEqual({ + variables: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }, + prependPath: [], + preserveCommand: true + }) + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) +}) + +describe('resolveBundledCliDirectory', () => { + it('finds development and packaged launchers without guessing a missing path', async () => { + const development = await createCliDirectory() + expect( + resolveBundledCliDirectory({ + appPath: development.root, + resourcesPath: '/unused', + isPackaged: false, + platform: 'darwin', + isFile: (filePath) => filePath === path.join(development.directory, 'deepchat') + }) + ).toBe(development.directory) + + const packagedRoot = await mkdtemp(path.join(os.tmpdir(), 'deepchat-packaged-cli-')) + temporaryDirectories.push(packagedRoot) + const packagedDirectory = path.join(packagedRoot, 'app.asar.unpacked', 'cli') + await mkdir(packagedDirectory, { recursive: true }) + await writeFile(path.join(packagedDirectory, 'deepchat.cmd'), '') + expect( + resolveBundledCliDirectory({ + appPath: '/unused', + resourcesPath: packagedRoot, + isPackaged: true, + platform: 'win32', + isFile: (filePath) => filePath === path.join(packagedDirectory, 'deepchat.cmd') + }) + ).toBe(packagedDirectory) + expect( + resolveBundledCliDirectory({ + appPath: '/missing', + resourcesPath: '/missing', + isPackaged: false, + platform: 'linux', + isFile: () => false + }) + ).toBeNull() + }) +}) diff --git a/test/main/cli/agentTokenAuthority.test.ts b/test/main/cli/agentTokenAuthority.test.ts new file mode 100644 index 0000000000..931c1602a9 --- /dev/null +++ b/test/main/cli/agentTokenAuthority.test.ts @@ -0,0 +1,179 @@ +import { describe, expect, it, vi } from 'vitest' +import { AgentCliTokenAuthority, AgentCliTokenCapacityError } from '@/cli/agentTokenAuthority' + +function token(character: string): string { + return character.repeat(43) +} + +const TEST_SCOPES = ['system:read'] as const + +describe('AgentCliTokenAuthority', () => { + it('issues bounded in-memory claims and consumes call and byte quotas', () => { + let now = 1_000 + const authority = new AgentCliTokenAuthority({ + now: () => now, + createToken: () => token('a'), + createTokenId: () => 'token-id-1234567890' + }) + const issued = authority.issue({ + conversationId: ' conversation-1 ', + scopes: ['models:invoke'], + ttlMs: 1_000, + maxCalls: 2, + maxBytes: 5 + }) + + expect(issued).toMatchObject({ + token: token('a'), + tokenId: 'token-id-1234567890', + conversationId: 'conversation-1', + expiresAt: 2_000, + scopes: ['models:invoke'], + maxCalls: 2, + maxBytes: 5 + }) + const first = authority.beginRequest(issued.token) + expect(first.status).toBe('granted') + if (first.status !== 'granted') throw new Error('Expected grant') + expect(first.grant.consumeBytes(3)).toBe(true) + first.grant.release() + const second = authority.beginRequest(issued.token) + expect(second.status).toBe('granted') + if (second.status !== 'granted') throw new Error('Expected grant') + expect(second.grant.consumeBytes(3)).toBe(false) + second.grant.release() + expect(authority.beginRequest(issued.token)).toEqual({ status: 'quota-exhausted' }) + + now = 2_000 + expect(authority.beginRequest(issued.token)).toEqual({ status: 'expired' }) + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) + + it('revokes every token and active grant for one conversation only', () => { + const generatedTokens = [token('a'), token('b'), token('c')] + const authority = new AgentCliTokenAuthority({ + createToken: () => generatedTokens.shift()!, + createTokenId: () => `token-id-${generatedTokens.length}`.padEnd(16, '0') + }) + const first = authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + const second = authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + const other = authority.issue({ conversationId: 'conversation-2', scopes: TEST_SCOPES }) + const active = authority.beginRequest(first.token) + if (active.status !== 'granted') throw new Error('Expected grant') + const abort = vi.fn() + active.grant.signal.addEventListener('abort', abort) + + authority.revokeConversation('conversation-1') + + expect(abort).toHaveBeenCalledOnce() + expect(authority.beginRequest(first.token)).toEqual({ status: 'invalid' }) + expect(authority.beginRequest(second.token)).toEqual({ status: 'invalid' }) + expect(authority.beginRequest(other.token).status).toBe('granted') + }) + + it('replaces the oldest per-conversation token but fails closed at global capacity', () => { + const generatedTokens = [token('a'), token('b'), token('c')] + let tokenId = 0 + const authority = new AgentCliTokenAuthority({ + createToken: () => generatedTokens.shift()!, + createTokenId: () => `token-id-${String((tokenId += 1)).padStart(8, '0')}`, + maxTokens: 2, + maxTokensPerConversation: 1 + }) + const first = authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + const replacement = authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + + expect(authority.beginRequest(first.token)).toEqual({ status: 'invalid' }) + expect(authority.beginRequest(replacement.token).status).toBe('granted') + authority.issue({ conversationId: 'conversation-2', scopes: TEST_SCOPES }) + expect(() => + authority.issue({ conversationId: 'conversation-3', scopes: TEST_SCOPES }) + ).toThrow(AgentCliTokenCapacityError) + }) + + it('reclaims completed exhausted grants before enforcing global capacity', () => { + const generatedTokens = [token('a'), token('b')] + let tokenId = 0 + const authority = new AgentCliTokenAuthority({ + createToken: () => generatedTokens.shift()!, + createTokenId: () => `token-id-${String((tokenId += 1)).padStart(8, '0')}`, + maxTokens: 1 + }) + const first = authority.issue({ + conversationId: 'conversation-1', + scopes: TEST_SCOPES, + maxCalls: 1 + }) + const active = authority.beginRequest(first.token) + if (active.status !== 'granted') throw new Error('Expected grant') + + expect(() => + authority.issue({ conversationId: 'conversation-2', scopes: TEST_SCOPES }) + ).toThrow(AgentCliTokenCapacityError) + active.grant.release() + const second = authority.issue({ conversationId: 'conversation-2', scopes: TEST_SCOPES }) + + expect(authority.beginRequest(first.token)).toEqual({ status: 'invalid' }) + expect(authority.beginRequest(second.token).status).toBe('granted') + }) + + it('never stores an invalid or duplicate generated token', () => { + const authority = new AgentCliTokenAuthority({ + createToken: () => 'not a token', + createTokenId: () => 'token-id-1234567890' + }) + + expect(() => + authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + ).toThrow() + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) + + it('requires every issued token to carry an explicit nonempty scope set', () => { + const authority = new AgentCliTokenAuthority() + + expect(() => authority.issue({ conversationId: 'conversation-1', scopes: [] })).toThrow( + 'scopes must contain at least one capability' + ) + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) + + it('does not revoke an existing token when replacement allocation fails', () => { + const generatedTokens = [token('a'), 'not a token'] + let tokenId = 0 + const authority = new AgentCliTokenAuthority({ + createToken: () => generatedTokens.shift()!, + createTokenId: () => `token-id-${String((tokenId += 1)).padStart(8, '0')}`, + maxTokensPerConversation: 1 + }) + const existing = authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + + expect(() => + authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES }) + ).toThrow() + expect(authority.beginRequest(existing.token).status).toBe('granted') + }) + + it('bounds custom lifetime, call, and byte limits', () => { + const authority = new AgentCliTokenAuthority() + + expect(() => + authority.issue({ + conversationId: 'conversation-1', + scopes: TEST_SCOPES, + ttlMs: 60 * 60_000 + 1 + }) + ).toThrow('ttlMs exceeds') + expect(() => + authority.issue({ conversationId: 'conversation-1', scopes: TEST_SCOPES, maxCalls: 1025 }) + ).toThrow('maxCalls exceeds') + expect(() => + authority.issue({ + conversationId: 'conversation-1', + scopes: TEST_SCOPES, + maxBytes: 1024 * 1024 * 1024 + 1 + }) + ).toThrow('maxBytes exceeds') + expect(authority.snapshot()).toEqual({ tokens: 0, conversations: 0 }) + }) +}) diff --git a/test/main/cli/args.test.ts b/test/main/cli/args.test.ts new file mode 100644 index 0000000000..72a0150a98 --- /dev/null +++ b/test/main/cli/args.test.ts @@ -0,0 +1,813 @@ +import { describe, expect, it } from 'vitest' +import { + CLI_OUTPUT_ENV, + CLI_TIMEOUT_ENV, + DEFAULT_COMPUTE_TIMEOUT_MS, + DEFAULT_MUTATION_TIMEOUT_MS, + formatCliHelp, + parseCliArguments +} from '../../../src/cli/args' + +describe('CLI argument grammar', () => { + it('maps the two-token command prefix to a canonical route', () => { + const parsed = parseCliArguments(['system', 'status'], {}) + + expect(parsed).toMatchObject({ + domain: 'system', + verb: 'status', + outputMode: 'text', + timeoutMs: 30_000, + helpRequested: false + }) + expect(parsed.contract?.name).toBe('cli.status') + }) + + it('accepts global flags only after the domain and verb', () => { + expect(parseCliArguments(['system', 'doctor', '--jsonl', '--timeout=2500'], {})).toMatchObject({ + outputMode: 'jsonl', + timeoutMs: 2_500 + }) + + expect(() => parseCliArguments(['--json', 'system', 'doctor'], {})).toThrow( + 'deepchat ' + ) + expect(() => parseCliArguments(['system', '--json', 'doctor'], {})).toThrow( + 'deepchat ' + ) + }) + + it('uses validated environment defaults and explicit output override', () => { + expect( + parseCliArguments(['system', 'version', '--json'], { + [CLI_OUTPUT_ENV]: 'text', + [CLI_TIMEOUT_ENV]: '9000' + }) + ).toMatchObject({ outputMode: 'json', timeoutMs: 9_000 }) + + expect(() => parseCliArguments(['system', 'version'], { [CLI_OUTPUT_ENV]: 'xml' })).toThrow( + `${CLI_OUTPUT_ENV} must be` + ) + }) + + it('rejects ambiguous and unbounded options', () => { + expect(() => parseCliArguments(['system', 'status', '--json', '--jsonl'], {})).toThrow( + 'mutually exclusive' + ) + expect(() => parseCliArguments(['system', 'status', '--timeout', '1800001'], {})).toThrow( + 'must not exceed' + ) + expect(() => parseCliArguments(['system', 'status', '--timeout', '--json'], {})).toThrow( + 'Missing value for --timeout' + ) + expect(() => parseCliArguments(['system', 'status', 'extra'], {})).toThrow('Unknown option') + }) + + it('keeps top-level help local while command help follows the two-token grammar', () => { + expect(parseCliArguments(['help'], {})).toMatchObject({ + domain: 'help', + verb: '', + contract: null, + helpRequested: true + }) + expect(() => parseCliArguments(['help', 'commands'], {})).toThrow('deepchat help') + expect(() => parseCliArguments(['--help'], {})).toThrow('deepchat ') + expect(formatCliHelp({ domain: 'agent', verb: 'run' })).toContain('--max-turns ') + expect(formatCliHelp({ domain: 'run', verb: 'watch' })).toContain('--cursor ') + expect(formatCliHelp({ domain: 'model', verb: 'list' })).toContain( + 'deepchat model list --provider ' + ) + }) + + it('parses artifact ownership commands without accepting output flags on metadata operations', () => { + const id = 'artifact_identifier_123' + + expect( + parseCliArguments(['artifact', 'get', '--id', id, '--out', './image.png', '--overwrite'], {}) + ).toMatchObject({ + operation: 'download', + params: { id }, + outputPath: './image.png', + overwrite: true + }) + expect(parseCliArguments(['artifact', 'describe', `--id=${id}`], {})).toMatchObject({ + operation: 'rpc', + params: { id } + }) + expect(() => + parseCliArguments(['artifact', 'delete', '--id', id, '--out', './invalid'], {}) + ).toThrow('only valid for deepchat artifact get') + expect(() => parseCliArguments(['artifact', 'get', '--id', id], {})).toThrow('requires --out') + expect(() => + parseCliArguments(['artifact', 'get', '--id', id, '--out', '--overwrite'], {}) + ).toThrow('Missing value for --out') + }) + + it('parses raw model input without allowing an ambiguous prompt source', () => { + expect( + parseCliArguments( + [ + 'model', + 'invoke', + '--provider', + 'provider-1', + '--model', + 'model-1', + '--system', + 'Be concise', + '--stdin', + '--temperature=0.2', + '--max-tokens', + '256' + ], + {} + ) + ).toMatchObject({ + operation: 'stream', + readStdin: true, + timeoutMs: DEFAULT_COMPUTE_TIMEOUT_MS, + params: { + providerId: 'provider-1', + modelId: 'model-1', + messages: [{ role: 'system', content: 'Be concise' }], + temperature: 0.2, + maxTokens: 256 + } + }) + + expect(() => + parseCliArguments( + [ + 'model', + 'invoke', + '--provider', + 'provider-1', + '--model', + 'model-1', + '--prompt', + 'hello', + '--stdin' + ], + {} + ) + ).toThrow('exactly one of --prompt or --stdin') + }) + + it('parses bounded durable Agent creation options', () => { + expect( + parseCliArguments( + [ + 'agent', + 'run', + '--prompt', + 'Run the benchmark', + '--agent', + 'deepchat', + '--provider', + 'provider-1', + '--model', + 'model-1', + '--system', + 'Be concise', + '--title', + 'Benchmark run', + '--project-dir', + '/tmp/project', + '--skills', + 'bench,reporting', + '--disable-tools', + 'dangerous-tool', + '--max-turns', + '8' + ], + {} + ) + ).toMatchObject({ + contract: { name: 'sessions.runDetached' }, + operation: 'rpc', + timeoutMs: DEFAULT_COMPUTE_TIMEOUT_MS, + params: { + prompt: 'Run the benchmark', + agentId: 'deepchat', + providerId: 'provider-1', + modelId: 'model-1', + systemPrompt: 'Be concise', + title: 'Benchmark run', + projectDir: '/tmp/project', + activeSkills: ['bench', 'reporting'], + disabledAgentTools: ['dangerous-tool'], + maxTurns: 8 + } + }) + expect(parseCliArguments(['agent', 'run', '--stdin'], {})).toMatchObject({ + readStdin: true, + params: {} + }) + expect(() => parseCliArguments(['agent', 'run', '--prompt', 'hello', '--stdin'], {})).toThrow( + 'exactly one of --prompt or --stdin' + ) + expect(() => + parseCliArguments(['agent', 'run', '--prompt', 'hello', '--skills', 'bench,bench'], {}) + ).toThrow('duplicate identifiers') + }) + + it('keeps run identity and message/event cursors in separate typed options', () => { + expect( + parseCliArguments( + [ + 'run', + 'get', + '--run', + 'run-1', + '--cursor', + '{"orderSeq":42,"id":"message-42"}', + '--limit', + '25' + ], + {} + ) + ).toMatchObject({ + contract: { name: 'runs.get' }, + operation: 'rpc', + params: { + runId: 'run-1', + cursor: { orderSeq: 42, id: 'message-42' }, + limit: 25 + } + }) + expect( + parseCliArguments( + ['run', 'watch', '--run', 'run-1', '--cursor', 'epoch-1:42', '--limit', '10'], + {} + ) + ).toMatchObject({ + contract: { name: 'events.subscribe' }, + operation: 'stream', + timeoutMs: DEFAULT_COMPUTE_TIMEOUT_MS, + params: { runId: 'run-1', cursor: 'epoch-1:42', messageLimit: 10 } + }) + expect(parseCliArguments(['run', 'cancel', '--run', 'run-1'], {})).toMatchObject({ + contract: { name: 'runs.cancel' }, + params: { runId: 'run-1' } + }) + expect(() => parseCliArguments(['run', 'get'], {})).toThrow('requires --run') + expect(() => + parseCliArguments(['run', 'get', '--run', 'run-1', '--cursor', 'epoch-1:42'], {}) + ).toThrow('JSON message cursor') + expect(() => + parseCliArguments(['run', 'watch', '--run', 'run-1', '--cursor', '{"orderSeq":1}'], {}) + ).toThrow('valid event cursor') + }) + + it('keeps model flags after the two-token capability signature', () => { + expect(() => + parseCliArguments( + ['--json', 'model', 'invoke', '--provider', 'provider-1', '--model', 'model-1'], + {} + ) + ).toThrow('deepchat ') + expect(() => parseCliArguments(['provider', 'list', '--provider', 'provider-1'], {})).toThrow( + 'not valid for deepchat provider list' + ) + expect(parseCliArguments(['provider', 'list', '--enabled-only'], {})).toMatchObject({ + params: { enabledOnly: true } + }) + }) + + it('parses allowlisted settings reads and one scalar update', () => { + expect( + parseCliArguments(['settings', 'get', '--keys', 'fontSizeLevel, privacyModeEnabled'], {}) + ).toMatchObject({ + contract: { name: 'settings.getPublic' }, + params: { keys: ['fontSizeLevel', 'privacyModeEnabled'] } + }) + expect( + parseCliArguments(['settings', 'set', '--key', 'fontSizeLevel', '--value', '3'], {}) + ).toMatchObject({ + contract: { name: 'settings.updatePublic' }, + params: { changes: [{ key: 'fontSizeLevel', value: 3 }] } + }) + expect( + parseCliArguments(['settings', 'set', '--key', 'fontFamily', '--value', 'Berkeley Mono'], {}) + ).toMatchObject({ + params: { changes: [{ key: 'fontFamily', value: 'Berkeley Mono' }] } + }) + expect( + parseCliArguments(['settings', 'set', '--key', 'fontSizeLevel', '--value', '3e0'], {}) + ).toMatchObject({ + params: { changes: [{ key: 'fontSizeLevel', value: 3 }] } + }) + + expect(() => parseCliArguments(['settings', 'get', '--keys', ','], {})).toThrow( + 'at least one setting key' + ) + expect(() => parseCliArguments(['settings', 'set', '--key', 'loggingEnabled'], {})).toThrow( + 'requires --key and --value' + ) + }) + + it('parses provider administration without accepting credentials in argv', () => { + expect( + parseCliArguments( + [ + 'provider', + 'add', + '--name', + 'Local API', + '--api-type', + 'openai-completions', + '--base-url', + 'http://localhost:8080/v1', + '--enabled', + 'false' + ], + {} + ) + ).toMatchObject({ + contract: { name: 'providers.addPublic' }, + params: { + name: 'Local API', + apiType: 'openai-completions', + baseUrl: 'http://localhost:8080/v1', + enabled: false + } + }) + expect( + parseCliArguments(['provider', 'set-credential', '--provider', 'provider-1', '--stdin'], {}) + ).toMatchObject({ + contract: { name: 'providers.setCredential' }, + params: { providerId: 'provider-1', action: 'set', kind: 'api-key' }, + readStdin: true + }) + expect(parseCliArguments(['provider', 'test', '--provider', 'provider-1'], {})).toMatchObject({ + contract: { name: 'providers.testPublicConnection' } + }) + expect(() => + parseCliArguments( + ['provider', 'set-credential', '--provider', 'provider-1', '--value', 'secret'], + {} + ) + ).toThrow('--value is not valid') + expect(() => parseCliArguments(['provider', 'update', '--provider', 'provider-1'], {})).toThrow( + 'at least one update' + ) + }) + + it('parses model administration with full config supplied only through stdin', () => { + expect( + parseCliArguments(['model', 'enable', '--provider', 'provider-1', '--model', 'model-1'], {}) + ).toMatchObject({ + contract: { name: 'models.setStatus' }, + params: { providerId: 'provider-1', modelId: 'model-1', enabled: true } + }) + expect( + parseCliArguments( + ['model', 'config-set', '--provider', 'provider-1', '--model', 'model-1', '--stdin'], + {} + ) + ).toMatchObject({ + contract: { name: 'models.setPublicConfig' }, + params: { providerId: 'provider-1', modelId: 'model-1' }, + readStdin: true + }) + expect(() => + parseCliArguments( + ['model', 'config-set', '--provider', 'provider-1', '--model', 'model-1'], + {} + ) + ).toThrow('requires --stdin') + }) + + it('maps image and video options without exposing file output paths', () => { + expect( + parseCliArguments( + [ + 'image', + 'generate', + '--provider', + 'provider-1', + '--model', + 'image-1', + '--prompt', + 'a lighthouse', + '--size', + '1024x1024', + '--quality', + 'high', + '--format', + 'webp', + '--compression', + '80', + '--background', + 'opaque', + '--moderation', + 'auto' + ], + {} + ) + ).toMatchObject({ + operation: 'stream', + timeoutMs: DEFAULT_COMPUTE_TIMEOUT_MS, + params: { + providerId: 'provider-1', + modelId: 'image-1', + prompt: 'a lighthouse', + options: { + size: '1024x1024', + quality: 'high', + outputFormat: 'webp', + outputCompression: 80, + background: 'opaque', + moderation: 'auto' + } + } + }) + + expect( + parseCliArguments( + [ + 'video', + 'generate', + '--provider=provider-1', + '--model=video-1', + '--stdin', + '--seconds=8', + '--ratio=16:9', + '--duration', + '-1', + '--resolution=1080p', + '--watermark=false', + '--audio=true' + ], + {} + ) + ).toMatchObject({ + operation: 'stream', + readStdin: true, + params: { + providerId: 'provider-1', + modelId: 'video-1', + options: { + seconds: '8', + ratio: '16:9', + duration: -1, + resolution: '1080p', + watermark: false, + generateAudio: true + } + } + }) + + expect(() => + parseCliArguments( + [ + 'image', + 'generate', + '--provider', + 'provider-1', + '--model', + 'image-1', + '--prompt', + 'hello', + '--out', + './image.png' + ], + {} + ) + ).toThrow('Artifact options are not valid') + }) + + it('maps speech input and rejects ambiguous or cross-domain media flags', () => { + expect( + parseCliArguments( + [ + 'audio', + 'speak', + '--provider', + 'provider-1', + '--model', + 'tts-1', + '--text', + 'hello', + '--voice', + 'alloy', + '--format', + 'wav', + '--speed', + '1.25', + '--instructions', + 'Speak softly' + ], + {} + ) + ).toMatchObject({ + operation: 'stream', + params: { + providerId: 'provider-1', + modelId: 'tts-1', + text: 'hello', + options: { + voice: 'alloy', + responseFormat: 'wav', + speed: 1.25, + instructions: 'Speak softly' + } + } + }) + + expect(() => + parseCliArguments( + [ + 'audio', + 'speak', + '--provider', + 'provider-1', + '--model', + 'tts-1', + '--text', + 'hello', + '--stdin' + ], + {} + ) + ).toThrow('exactly one of --text or --stdin') + expect(() => + parseCliArguments( + [ + 'video', + 'generate', + '--provider', + 'provider-1', + '--model', + 'video-1', + '--prompt', + 'hello', + '--voice', + 'alloy' + ], + {} + ) + ).toThrow('--voice is not valid for deepchat video generate') + }) + + it('keeps media-specific options discoverable from command help', () => { + expect(formatCliHelp({ domain: 'image', verb: 'generate' })).toContain('--compression ') + expect(formatCliHelp({ domain: 'video', verb: 'generate' })).toContain('--watermark ') + expect(formatCliHelp({ domain: 'audio', verb: 'speak' })).toContain('--voice ') + }) + + it('selects upload and artifact contracts for audio transcription', () => { + expect( + parseCliArguments( + [ + 'audio', + 'transcribe', + '--provider', + 'provider-1', + '--model', + 'whisper-1', + '--file', + './meeting.MP3' + ], + {} + ) + ).toMatchObject({ + operation: 'upload', + inputPath: './meeting.MP3', + uploadMaxBytes: 25 * 1024 * 1024, + contract: { name: 'audio.transcribeUpload' }, + params: { + providerId: 'provider-1', + modelId: 'whisper-1', + mimeType: 'audio/mpeg', + filename: 'meeting.MP3' + } + }) + + expect( + parseCliArguments( + [ + 'audio', + 'transcribe', + '--provider', + 'provider-1', + '--model', + 'whisper-1', + '--artifact', + 'artifact_identifier_123' + ], + {} + ) + ).toMatchObject({ + operation: 'rpc', + contract: { name: 'audio.transcribeArtifact' }, + params: { + providerId: 'provider-1', + modelId: 'whisper-1', + artifactId: 'artifact_identifier_123' + } + }) + }) + + it('maps OCR input modes and bounded PDF options', () => { + expect( + parseCliArguments( + [ + 'ocr', + 'extract', + '--file', + './scan.pdf', + '--backend', + 'cpu', + '--page-count', + '12', + '--max-tokens', + '4096' + ], + {} + ) + ).toMatchObject({ + operation: 'upload', + inputPath: './scan.pdf', + uploadMaxBytes: 50 * 1024 * 1024, + contract: { name: 'ocr.extractUpload' }, + params: { + mimeType: 'application/pdf', + backend: 'cpu', + sourcePageCountHint: 12, + generationTokenLimit: 4096 + } + }) + expect( + parseCliArguments(['ocr', 'extract', '--artifact', 'artifact_identifier_123'], {}) + ).toMatchObject({ + operation: 'rpc', + contract: { name: 'ocr.extractArtifact' }, + params: { artifactId: 'artifact_identifier_123' } + }) + expect(parseCliArguments(['ocr', 'status'], {}).contract?.name).toBe('ocr.getRuntimeStatus') + expect(parseCliArguments(['ocr', 'clear-cache'], {})).toMatchObject({ + contract: { name: 'ocr.clearCache' }, + timeoutMs: DEFAULT_COMPUTE_TIMEOUT_MS + }) + }) + + it('rejects ambiguous or unverifiable file-input options', () => { + expect(() => + parseCliArguments( + ['ocr', 'extract', '--file', './scan.png', '--artifact', 'artifact_identifier_123'], + {} + ) + ).toThrow('exactly one of --file or --artifact') + expect(() => parseCliArguments(['ocr', 'extract', '--file', './scan.unknown'], {})).toThrow( + 'provide --mime' + ) + expect(() => + parseCliArguments(['ocr', 'extract', '--file', './scan.png', '--mime', ' '], {}) + ).toThrow('--mime must not be empty') + expect(() => + parseCliArguments( + ['ocr', 'extract', '--artifact', 'artifact_identifier_123', '--mime', 'image/png'], + {} + ) + ).toThrow('--mime is only valid together with --file') + expect(() => + parseCliArguments(['ocr', 'extract', '--file', './scan.pdf', '--max-tokens', '16001'], {}) + ).toThrow('--max-tokens must not exceed 16000') + expect(() => + parseCliArguments(['ocr', 'extract', '--file', './scan.png', '--page-count', '1'], {}) + ).toThrow('only valid for PDF input') + }) + + it('keeps transcription and OCR options discoverable', () => { + expect(formatCliHelp({ domain: 'audio', verb: 'transcribe' })).toContain('--mime ') + expect(formatCliHelp({ domain: 'ocr', verb: 'extract' })).toContain('--page-count ') + expect(formatCliHelp()).toContain('ocr clear-cache') + }) + + it('parses public Skill management without exposing arbitrary paths', () => { + expect(parseCliArguments(['skill', 'list'], {})).toMatchObject({ + operation: 'rpc', + contract: { name: 'skills.listPublic' }, + params: {} + }) + expect( + parseCliArguments( + ['skill', 'install', '--file', './safe-skill.zip', '--agent', 'agent-1', '--overwrite'], + {} + ) + ).toMatchObject({ + operation: 'upload', + contract: { name: 'skills.installUpload' }, + inputPath: './safe-skill.zip', + uploadMaxBytes: 200 * 1024 * 1024, + params: { + agentId: 'agent-1', + filename: 'safe-skill.zip', + overwrite: true + } + }) + expect( + parseCliArguments( + ['skill', 'install', '--url', 'https://skills.example/archive.zip?signature=private'], + {} + ) + ).toMatchObject({ + operation: 'rpc', + contract: { name: 'skills.installPublicUrl' }, + params: { + url: 'https://skills.example/archive.zip?signature=private', + overwrite: false + } + }) + expect(parseCliArguments(['skill', 'disable', '--name', 'safe-skill'], {})).toMatchObject({ + contract: { name: 'skills.setPublicStatus' }, + params: { name: 'safe-skill', enabled: false } + }) + expect(parseCliArguments(['skill', 'remove', '--name', 'safe-skill'], {})).toMatchObject({ + contract: { name: 'skills.uninstallPublic' }, + params: { name: 'safe-skill' } + }) + + expect(() => + parseCliArguments(['skill', 'install', '--file', 'a.zip', '--url', 'https://x'], {}) + ).toThrow('exactly one of --file or --url') + expect(() => parseCliArguments(['skill', 'enable'], {})).toThrow('requires --name') + expect(() => parseCliArguments(['skill', 'list', '--overwrite'], {})).toThrow( + '--overwrite is not valid' + ) + }) + + it('keeps Skill commands discoverable', () => { + expect(formatCliHelp({ domain: 'skill', verb: 'install' })).toContain( + '--file |--url ' + ) + expect(formatCliHelp()).toContain('skill remove') + }) + + it('parses public MCP administration without accepting inline configuration', () => { + expect(parseCliArguments(['mcp', 'list'], {})).toMatchObject({ + operation: 'rpc', + contract: { name: 'mcp.listPublic' }, + params: {} + }) + expect( + parseCliArguments(['mcp', 'add', '--name', 'local-server', '--stdin'], {}) + ).toMatchObject({ + contract: { name: 'mcp.addPublic' }, + params: { serverName: 'local-server' }, + readStdin: true, + timeoutMs: DEFAULT_MUTATION_TIMEOUT_MS + }) + expect( + parseCliArguments(['mcp', 'update', '--name=local-server', '--stdin'], {}) + ).toMatchObject({ + contract: { name: 'mcp.updatePublic' }, + params: { serverName: 'local-server' }, + readStdin: true + }) + expect(parseCliArguments(['mcp', 'disable', '--name', 'local-server'], {})).toMatchObject({ + contract: { name: 'mcp.setPublicStatus' }, + params: { serverName: 'local-server', enabled: false } + }) + expect(parseCliArguments(['mcp', 'start', '--name', 'local-server'], {})).toMatchObject({ + contract: { name: 'mcp.startPublic' }, + params: { serverName: 'local-server' } + }) + expect(parseCliArguments(['mcp', 'stop', '--name', 'local-server'], {})).toMatchObject({ + contract: { name: 'mcp.stopPublic' }, + params: { serverName: 'local-server' } + }) + expect(parseCliArguments(['mcp', 'remove', '--name', 'local-server'], {})).toMatchObject({ + contract: { name: 'mcp.removePublic' }, + params: { serverName: 'local-server' } + }) + + expect(() => parseCliArguments(['mcp', 'add', '--name', 'local-server'], {})).toThrow( + 'requires --stdin' + ) + expect(() => parseCliArguments(['mcp', 'update', '--stdin'], {})).toThrow('requires --name') + expect(() => parseCliArguments(['mcp', 'list', '--name', 'unexpected'], {})).toThrow( + '--name is not valid' + ) + }) + + it('leaves enough time for approvals and large artifact delivery by default', () => { + expect( + parseCliArguments(['provider', 'remove', '--provider', 'provider-1'], {}).timeoutMs + ).toBe(DEFAULT_MUTATION_TIMEOUT_MS) + expect(parseCliArguments(['skill', 'enable', '--name', 'skill-1'], {}).timeoutMs).toBe( + DEFAULT_MUTATION_TIMEOUT_MS + ) + expect( + parseCliArguments( + ['artifact', 'get', '--id', 'artifact_identifier_123', '--out', './output.bin'], + {} + ).timeoutMs + ).toBe(DEFAULT_COMPUTE_TIMEOUT_MS) + }) + + it('keeps MCP commands discoverable', () => { + expect(formatCliHelp({ domain: 'mcp', verb: 'add' })).toContain('--name --stdin') + expect(formatCliHelp()).toContain('mcp remove') + }) +}) diff --git a/test/main/cli/artifactSpool.test.ts b/test/main/cli/artifactSpool.test.ts new file mode 100644 index 0000000000..85973013f4 --- /dev/null +++ b/test/main/cli/artifactSpool.test.ts @@ -0,0 +1,390 @@ +import { mkdtemp, readFile, readdir, rm, stat, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { ArtifactSpool } from '@/cli/artifactSpool' +import type { AgentCliRouteCaller, HumanCliRouteCaller } from '@/routes/routeRegistry' + +const spools: ArtifactSpool[] = [] +const temporaryDirectories: string[] = [] + +const humanCaller: HumanCliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'human-connection', + scopes: ['artifacts:read', 'artifacts:manage'] +} + +const agentCaller = (conversationId: string): AgentCliRouteCaller => ({ + kind: 'cli', + principal: 'agent', + connectionId: `agent-${conversationId}`, + tokenId: `token-id-${conversationId}`, + conversationId, + expiresAt: Date.now() + 60_000, + scopes: ['artifacts:read'] +}) + +async function createSpool( + options: Omit[0], 'directory'> = {} +): Promise<{ spool: ArtifactSpool; directory: string }> { + const root = await mkdtemp(path.join(os.tmpdir(), 'deepchat-artifact-spool-')) + temporaryDirectories.push(root) + const directory = path.join(root, 'artifacts') + const spool = new ArtifactSpool({ directory, consumeAgentBytes: () => true, ...options }) + spools.push(spool) + return { spool, directory } +} + +async function collect(stream: NodeJS.ReadableStream): Promise { + const chunks: Buffer[] = [] + for await (const chunk of stream) chunks.push(Buffer.from(chunk)) + return Buffer.concat(chunks) +} + +afterEach(async () => { + await Promise.allSettled(spools.splice(0).map((spool) => spool.close())) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('ArtifactSpool', () => { + it('publishes private metadata and bytes without exposing a path', async () => { + const { spool, directory } = await createSpool() + const metadata = await spool.write({ + caller: humanCaller, + requestId: 'request-1', + mimeType: 'audio/ogg; codecs=opus', + suggestedFilename: '../voice.ogg', + data: Buffer.from('generated-audio') + }) + + expect(metadata).toMatchObject({ + owner: 'human', + mimeType: 'audio/ogg; codecs=opus', + filename: '.._voice.ogg', + size: 15 + }) + expect(metadata).not.toHaveProperty('path') + if (process.platform !== 'win32') { + expect((await stat(directory)).mode & 0o777).toBe(0o700) + } + + const opened = await spool.openRead(metadata.id, humanCaller) + expect(await collect(opened.stream)).toEqual(Buffer.from('generated-audio')) + expect(await readFile(path.join(directory, `${metadata.id}.artifact`), 'utf8')).toBe( + 'generated-audio' + ) + }) + + it('streams writes while hashing and accounting the complete result', async () => { + const { spool } = await createSpool() + async function* chunks(): AsyncGenerator { + yield Buffer.from('generated-') + yield new Uint8Array() + yield Buffer.from('video') + } + + const metadata = await spool.write({ + caller: humanCaller, + requestId: 'request-stream', + mimeType: 'video/mp4', + data: chunks() + }) + + expect(metadata).toMatchObject({ size: 15, filename: 'artifact.mp4' }) + const opened = await spool.openRead(metadata.id, humanCaller) + expect(await collect(opened.stream)).toEqual(Buffer.from('generated-video')) + }) + + it('removes partial output and releases quota when a write is cancelled', async () => { + const { spool, directory } = await createSpool({ + limits: { + maxArtifactBytes: 8, + maxRequestBytes: 8, + maxConnectionBytes: 8, + maxOwnerBytes: 8, + maxTotalBytes: 8 + } + }) + const controller = new AbortController() + async function* chunks(): AsyncGenerator { + yield Buffer.from('part') + controller.abort() + yield Buffer.from('more') + } + + await expect( + spool.write({ + caller: humanCaller, + requestId: 'request-cancelled', + mimeType: 'application/octet-stream', + data: chunks(), + signal: controller.signal + }) + ).rejects.toMatchObject({ code: 'cancelled' }) + expect(await readdir(directory)).toEqual([]) + + await expect( + spool.write({ + caller: humanCaller, + requestId: 'request-after-cancel', + mimeType: 'application/octet-stream', + data: Buffer.alloc(8) + }) + ).resolves.toMatchObject({ size: 8 }) + }) + + it('isolates Agent artifacts by conversation while allowing human recovery', async () => { + const { spool } = await createSpool() + const owner = agentCaller('conversation-a') + const metadata = await spool.write({ + caller: owner, + requestId: 'request-1', + mimeType: 'image/png', + data: Buffer.from('png') + }) + + await expect(spool.describe(metadata.id, owner)).resolves.toEqual(metadata) + await expect(spool.describe(metadata.id, agentCaller('conversation-b'))).rejects.toMatchObject({ + code: 'permission_denied' + }) + await expect(spool.describe(metadata.id, humanCaller)).resolves.toEqual(metadata) + }) + + it('stops and removes an Agent artifact when its token byte quota is exhausted', async () => { + let remainingBytes = 5 + const { spool, directory } = await createSpool({ + consumeAgentBytes: (_tokenId, bytes) => { + if (bytes > remainingBytes) return false + remainingBytes -= bytes + return true + } + }) + async function* chunks(): AsyncGenerator { + yield Buffer.from('1234') + yield Buffer.from('5678') + } + + await expect( + spool.write({ + caller: agentCaller('conversation-a'), + requestId: 'request-quota', + mimeType: 'application/octet-stream', + data: chunks() + }) + ).rejects.toMatchObject({ code: 'rate_limited' }) + expect(await readdir(directory)).toEqual([]) + }) + + it('accounts in-flight writes before enforcing aggregate quotas', async () => { + const { spool } = await createSpool({ + limits: { + maxArtifactBytes: 8, + maxOwnerBytes: 10, + maxTotalBytes: 10, + maxOwnerCount: 2, + maxTotalCount: 2 + } + }) + + const writes = await Promise.allSettled([ + spool.write({ + caller: humanCaller, + requestId: 'request-1', + mimeType: 'application/octet-stream', + data: Buffer.alloc(6, 1) + }), + spool.write({ + caller: humanCaller, + requestId: 'request-2', + mimeType: 'application/octet-stream', + data: Buffer.alloc(6, 2) + }) + ]) + + expect(writes.filter((result) => result.status === 'fulfilled')).toHaveLength(1) + expect(writes.filter((result) => result.status === 'rejected')).toHaveLength(1) + expect(writes.find((result) => result.status === 'rejected')).toMatchObject({ + reason: { code: 'rate_limited' } + }) + }) + + it('enforces request and connection quotas independently', async () => { + const { spool } = await createSpool({ + limits: { + maxArtifactBytes: 8, + maxRequestBytes: 8, + maxConnectionBytes: 12, + maxOwnerBytes: 32, + maxTotalBytes: 32, + maxRequestCount: 2, + maxConnectionCount: 4, + maxOwnerCount: 8, + maxTotalCount: 8 + } + }) + await spool.write({ + caller: humanCaller, + requestId: 'request-1', + mimeType: 'application/octet-stream', + data: Buffer.alloc(6) + }) + + await expect( + spool.write({ + caller: humanCaller, + requestId: 'request-1', + mimeType: 'application/octet-stream', + data: Buffer.alloc(3) + }) + ).rejects.toMatchObject({ code: 'rate_limited' }) + await spool.write({ + caller: humanCaller, + requestId: 'request-2', + mimeType: 'application/octet-stream', + data: Buffer.alloc(6) + }) + await expect( + spool.write({ + caller: humanCaller, + requestId: 'request-3', + mimeType: 'application/octet-stream', + data: Buffer.alloc(1) + }) + ).rejects.toMatchObject({ code: 'rate_limited' }) + }) + + it('releases committed quota after removing an artifact', async () => { + const { spool } = await createSpool({ + limits: { + maxArtifactBytes: 6, + maxRequestBytes: 6, + maxConnectionBytes: 6, + maxOwnerBytes: 6, + maxTotalBytes: 6, + maxRequestCount: 1, + maxConnectionCount: 1, + maxOwnerCount: 1, + maxTotalCount: 1 + } + }) + const first = await spool.write({ + caller: humanCaller, + requestId: 'request-before-removal', + mimeType: 'application/octet-stream', + data: Buffer.alloc(6) + }) + + await spool.discard(first.id) + + await expect( + spool.write({ + caller: humanCaller, + requestId: 'request-after-removal', + mimeType: 'application/octet-stream', + data: Buffer.alloc(6) + }) + ).resolves.toMatchObject({ size: 6 }) + }) + + it('expires artifacts and removes their files', async () => { + let now = 1_000 + const { spool, directory } = await createSpool({ now: () => now }) + const metadata = await spool.write({ + caller: humanCaller, + requestId: 'request-1', + mimeType: 'text/plain', + data: Buffer.from('temporary'), + ttlMs: 10 + }) + + now = 1_011 + await expect(spool.describe(metadata.id, humanCaller)).rejects.toMatchObject({ + code: 'not_found' + }) + expect(await readdir(directory)).toEqual([]) + }) + + it('keeps active downloads stable and rejects concurrent deletion', async () => { + const { spool } = await createSpool() + const metadata = await spool.write({ + caller: humanCaller, + requestId: 'request-1', + mimeType: 'application/octet-stream', + data: Buffer.alloc(64 * 1024, 1) + }) + const opened = await spool.openRead(metadata.id, humanCaller) + + await expect(spool.delete(metadata.id, humanCaller)).rejects.toMatchObject({ + code: 'conflict', + retriable: true + }) + expect(await collect(opened.stream)).toHaveLength(metadata.size) + await expect(spool.delete(metadata.id, humanCaller)).resolves.toBeUndefined() + await expect(spool.describe(metadata.id, humanCaller)).rejects.toMatchObject({ + code: 'not_found' + }) + }) + + it('leases an owned file for domain input without exposing its path in metadata', async () => { + const { spool } = await createSpool() + const owner = agentCaller('conversation-a') + const metadata = await spool.write({ + caller: owner, + requestId: 'request-input', + mimeType: 'audio/wav', + data: Buffer.from('audio-input') + }) + + const bytes = await spool.withFile(metadata.id, owner, async (file) => { + expect(file.metadata).not.toHaveProperty('path') + await expect(spool.delete(metadata.id, humanCaller)).rejects.toMatchObject({ + code: 'conflict' + }) + return await readFile(file.path) + }) + + expect(bytes).toEqual(Buffer.from('audio-input')) + await expect( + spool.withFile(metadata.id, agentCaller('conversation-b'), async () => undefined) + ).rejects.toMatchObject({ code: 'permission_denied' }) + await expect(spool.delete(metadata.id, humanCaller)).resolves.toBeUndefined() + }) + + it('defers internal discard until active reads finish and blocks new readers', async () => { + const { spool, directory } = await createSpool() + const metadata = await spool.write({ + caller: humanCaller, + requestId: 'request-discard', + mimeType: 'application/octet-stream', + data: Buffer.alloc(64 * 1024, 1) + }) + const opened = await spool.openRead(metadata.id, humanCaller) + + await expect(spool.discard(metadata.id)).resolves.toBeUndefined() + await expect(spool.openRead(metadata.id, humanCaller)).rejects.toMatchObject({ + code: 'not_found' + }) + expect(await collect(opened.stream)).toHaveLength(metadata.size) + await expect.poll(async () => readdir(directory)).toEqual([]) + }) + + it('cleans only spool-owned crash remnants during initialization', async () => { + const { spool, directory } = await createSpool() + await writeFile(path.join(path.dirname(directory), 'keep.txt'), 'outside') + await spool.initialize() + await writeFile(path.join(directory, '.abcdefghijklmnop.tmp'), 'partial') + await writeFile(path.join(directory, 'abcdefghijklmnop.artifact'), 'stale') + await writeFile(path.join(directory, 'keep.txt'), 'foreign') + await spool.close() + + const replacement = new ArtifactSpool({ directory }) + spools.push(replacement) + await replacement.initialize() + + expect(await readdir(directory)).toEqual(['keep.txt']) + expect(await readFile(path.join(path.dirname(directory), 'keep.txt'), 'utf8')).toBe('outside') + }) +}) diff --git a/test/main/cli/artifacts.test.ts b/test/main/cli/artifacts.test.ts new file mode 100644 index 0000000000..9a322c4383 --- /dev/null +++ b/test/main/cli/artifacts.test.ts @@ -0,0 +1,245 @@ +import { EventEmitter } from 'node:events' +import { mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { DeepchatRouteName } from '@shared/contracts/routes' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + LocalControlRpcResponseSchema +} from '@shared/contracts/localControl' +import { ArtifactSpool } from '@/cli/artifactSpool' +import { createArtifactRoutes } from '@/cli/artifactRoutes' +import { CliServer } from '@/cli/server' +import type { CliRouteCaller, HumanCliRouteCaller } from '@/routes/routeRegistry' +import { publishArtifactDownload } from '../../../src/cli/artifacts' +import { runCli } from '../../../src/cli/run' + +const servers: CliServer[] = [] +const spools: ArtifactSpool[] = [] +const temporaryDirectories: string[] = [] + +const originCaller: HumanCliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'origin', + scopes: ['artifacts:read', 'artifacts:manage'] +} + +function captureOutput(): { stream: NodeJS.WriteStream; read(): string } { + let value = '' + return { + stream: { + write: (chunk: string | Uint8Array) => { + value += typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8') + return true + } + } as NodeJS.WriteStream, + read: () => value + } +} + +async function createHarness(): Promise<{ + userDataPath: string + spool: ArtifactSpool +}> { + const userDataPath = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-artifacts-')) + temporaryDirectories.push(userDataPath) + const spool = new ArtifactSpool({ + directory: path.join(userDataPath, 'local-control', 'artifacts') + }) + spools.push(spool) + await spool.initialize() + const routes = createArtifactRoutes(spool) + const server = new CliServer({ + userDataPath, + appVersion: '1.2.3', + artifactSpool: spool, + dispatch: async (method: string, input: unknown, caller: CliRouteCaller) => { + const route = routes.get(method as DeepchatRouteName) + if (!route) throw new Error(`Unknown artifact test route: ${method}`) + return await route(input, { caller }) + }, + log: { warn: vi.fn(), error: vi.fn() } + }) + servers.push(server) + await server.start() + return { userDataPath, spool } +} + +function invoke(argv: readonly string[], env: NodeJS.ProcessEnv) { + const stdout = captureOutput() + const stderr = captureOutput() + return { + result: runCli(argv, { + env, + stdout: stdout.stream, + stderr: stderr.stream, + signalHost: new EventEmitter() as unknown as NodeJS.Process, + randomId: () => 'request-1', + forceExit: vi.fn() + }), + stdout, + stderr + } +} + +afterEach(async () => { + await Promise.all(servers.splice(0).map((server) => server.stop())) + await Promise.allSettled(spools.splice(0).map((spool) => spool.close())) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('artifact CLI', () => { + it('publishes without overwrite when the destination filesystem rejects hardlinks', async () => { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-artifact-output-')) + temporaryDirectories.push(directory) + const sourcePath = path.join(directory, '.source.tmp') + const outputPath = path.join(directory, 'output.bin') + const portableOutput = Buffer.from( + Array.from({ length: 128 * 1024 + 17 }, (_, index) => index % 251) + ) + await writeFile(sourcePath, portableOutput) + const unsupportedLink = vi.fn(async () => { + throw Object.assign(new Error('hardlinks are unavailable'), { code: 'EPERM' }) + }) + + await publishArtifactDownload(sourcePath, outputPath, false, unsupportedLink) + expect(await readFile(outputPath)).toEqual(portableOutput) + + const replacementPath = path.join(directory, '.replacement.tmp') + await writeFile(replacementPath, 'replacement') + await expect( + publishArtifactDownload(replacementPath, outputPath, false, unsupportedLink) + ).rejects.toMatchObject({ code: 'conflict' }) + expect(await readFile(outputPath)).toEqual(portableOutput) + }) + + it('downloads verified bytes and emits the canonical machine envelope', async () => { + const { userDataPath, spool } = await createHarness() + const artifact = await spool.write({ + caller: originCaller, + requestId: 'generation-1', + mimeType: 'image/png', + suggestedFilename: 'generated.png', + data: Buffer.from('generated-image') + }) + const outputPath = path.join(userDataPath, 'result.png') + const invocation = invoke( + ['artifact', 'get', '--id', artifact.id, '--out', outputPath, '--json'], + { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath } + ) + + await expect(invocation.result).resolves.toBe(0) + expect(await readFile(outputPath, 'utf8')).toBe('generated-image') + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: true, + result: { artifact: { id: artifact.id, sha256: artifact.sha256 } } + } + ) + expect(invocation.stderr.read()).toBe('') + }) + + it('preserves an existing file unless overwrite is explicit', async () => { + const { userDataPath, spool } = await createHarness() + const artifact = await spool.write({ + caller: originCaller, + requestId: 'generation-1', + mimeType: 'application/octet-stream', + data: Buffer.from('replacement') + }) + const outputPath = path.join(userDataPath, 'existing.bin') + await writeFile(outputPath, 'original') + + const refused = invoke(['artifact', 'get', '--id', artifact.id, '--out', outputPath], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath + }) + await expect(refused.result).resolves.toBe(6) + expect(await readFile(outputPath, 'utf8')).toBe('original') + + const replaced = invoke( + ['artifact', 'get', '--id', artifact.id, '--out', outputPath, '--overwrite'], + { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath } + ) + await expect(replaced.result).resolves.toBe(0) + expect(await readFile(outputPath, 'utf8')).toBe('replacement') + }) + + it('rejects changed bytes and removes partial output', async () => { + const { userDataPath, spool } = await createHarness() + const artifact = await spool.write({ + caller: originCaller, + requestId: 'generation-1', + mimeType: 'application/octet-stream', + data: Buffer.from('expected') + }) + await writeFile( + path.join(userDataPath, 'local-control', 'artifacts', `${artifact.id}.artifact`), + 'tampered' + ) + const outputPath = path.join(userDataPath, 'changed.bin') + const invocation = invoke(['artifact', 'get', '--id', artifact.id, '--out', outputPath], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath + }) + + await expect(invocation.result).resolves.toBe(8) + await expect(readFile(outputPath)).rejects.toMatchObject({ code: 'ENOENT' }) + expect((await readdir(userDataPath)).filter((entry) => entry.startsWith('.deepchat-'))).toEqual( + [] + ) + }) + + it('rejects Agent byte downloads before route dispatch', async () => { + const { userDataPath, spool } = await createHarness() + const artifact = await spool.write({ + caller: originCaller, + requestId: 'generation-1', + mimeType: 'image/png', + data: Buffer.from('private') + }) + const outputPath = path.join(userDataPath, 'agent-output.png') + const invocation = invoke( + ['artifact', 'get', '--id', artifact.id, '--out', outputPath, '--json'], + { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath, + [LOCAL_CONTROL_AGENT_TOKEN_ENV]: 'a'.repeat(43) + } + ) + + await expect(invocation.result).resolves.toBe(4) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: false, + error: { code: 'permission_denied' } + } + ) + await expect(readFile(outputPath)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('describes and deletes artifacts through typed RPC routes', async () => { + const { userDataPath, spool } = await createHarness() + const artifact = await spool.write({ + caller: originCaller, + requestId: 'generation-1', + mimeType: 'text/plain', + data: Buffer.from('result') + }) + const env = { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath } + + const described = invoke(['artifact', 'describe', '--id', artifact.id, '--json'], env) + await expect(described.result).resolves.toBe(0) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(described.stdout.read()))).toMatchObject({ + ok: true, + result: { artifact: { id: artifact.id } } + }) + + const deleted = invoke(['artifact', 'delete', '--id', artifact.id], env) + await expect(deleted.result).resolves.toBe(0) + await expect(spool.describe(artifact.id, originCaller)).rejects.toMatchObject({ + code: 'not_found' + }) + }) +}) diff --git a/test/main/cli/auditLog.test.ts b/test/main/cli/auditLog.test.ts new file mode 100644 index 0000000000..0ce1e7681d --- /dev/null +++ b/test/main/cli/auditLog.test.ts @@ -0,0 +1,123 @@ +import { link, mkdtemp, mkdir, readFile, rm, stat, symlink, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { CliAuditLog } from '@/cli/auditLog' +import type { CliPolicyAuditRecord } from '@/cli/policy' + +vi.unmock('fs') +vi.unmock('node:fs') +vi.unmock('fs/promises') +vi.unmock('node:fs/promises') +vi.unmock('path') +vi.unmock('node:path') + +const directories: string[] = [] + +function auditRecord(requestId: string): CliPolicyAuditRecord { + return { + timestamp: 1_788_000_000_000, + principal: 'human', + connectionId: 'connection-1', + operation: 'settings.set', + effect: 'preference-write', + outcome: 'allowed', + requestId, + redactedArgumentsHash: 'a'.repeat(64) + } +} + +async function createDirectory(): Promise { + const directory = await mkdtemp(path.join(tmpdir(), 'deepchat-cli-audit-')) + directories.push(directory) + return directory +} + +async function readRecords(filePath: string): Promise { + return (await readFile(filePath, 'utf8')) + .trim() + .split('\n') + .map((line) => JSON.parse(line) as CliPolicyAuditRecord) +} + +afterEach(async () => { + await Promise.all( + directories + .splice(0) + .map((directory) => rm(directory, { recursive: true, force: true, maxRetries: 3 })) + ) +}) + +describe('CliAuditLog', () => { + it('serializes concurrent records in call order and creates private paths', async () => { + const directory = path.join(await createDirectory(), 'local-control') + const log = new CliAuditLog({ directory }) + + await Promise.all(Array.from({ length: 20 }, (_, index) => log.record(auditRecord(`${index}`)))) + await log.close() + + const records = await readRecords(path.join(directory, 'audit.jsonl')) + expect(records.map((record) => record.requestId)).toEqual( + Array.from({ length: 20 }, (_, index) => `${index}`) + ) + if (process.platform !== 'win32') { + expect((await stat(directory)).mode & 0o777).toBe(0o700) + expect((await stat(path.join(directory, 'audit.jsonl'))).mode & 0o777).toBe(0o600) + } + }) + + it('keeps only the two newest bounded audit segments', async () => { + const directory = path.join(await createDirectory(), 'local-control') + const recordBytes = Buffer.byteLength(`${JSON.stringify(auditRecord('1'))}\n`, 'utf8') + const log = new CliAuditLog({ directory, maxBytes: recordBytes + 1 }) + + await log.record(auditRecord('1')) + await log.record(auditRecord('2')) + await log.record(auditRecord('3')) + await log.close() + + expect(await readRecords(path.join(directory, 'audit.1.jsonl'))).toMatchObject([ + { requestId: '2' } + ]) + expect(await readRecords(path.join(directory, 'audit.jsonl'))).toMatchObject([ + { requestId: '3' } + ]) + }) + + it('rejects records after close', async () => { + const directory = path.join(await createDirectory(), 'local-control') + const log = new CliAuditLog({ directory }) + await log.close() + + await expect(log.record(auditRecord('late'))).rejects.toThrow('audit log is closed') + }) + + it.skipIf(process.platform === 'win32')('refuses to follow a symlinked audit file', async () => { + const root = await createDirectory() + const directory = path.join(root, 'local-control') + const target = path.join(root, 'target.jsonl') + await mkdir(directory) + await symlink(target, path.join(directory, 'audit.jsonl')) + const log = new CliAuditLog({ directory }) + + await expect(log.record(auditRecord('1'))).rejects.toMatchObject({ code: 'ELOOP' }) + await log.close() + }) + + it.skipIf(process.platform === 'win32')( + 'refuses an audit file with multiple hard links', + async () => { + const root = await createDirectory() + const directory = path.join(root, 'local-control') + const target = path.join(root, 'target.jsonl') + await mkdir(directory) + await writeFile(target, '') + await link(target, path.join(directory, 'audit.jsonl')) + const log = new CliAuditLog({ directory }) + + await expect(log.record(auditRecord('1'))).rejects.toThrow('must not have multiple links') + await log.close() + expect(await readFile(target, 'utf8')).toBe('') + } + ) +}) diff --git a/test/main/cli/body.test.ts b/test/main/cli/body.test.ts new file mode 100644 index 0000000000..b5bd259cdd --- /dev/null +++ b/test/main/cli/body.test.ts @@ -0,0 +1,143 @@ +import { createHash } from 'node:crypto' +import { Readable } from 'node:stream' +import type { IncomingMessage } from 'node:http' +import { mkdtemp, readFile, readdir, rm, stat } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { parseBoundedJsonBody, parseBoundedJsonBytes, readBoundedRequestBody } from '@/cli/body' +import { CliRequestError } from '@/cli/errors' + +const temporaryDirectories: string[] = [] + +function sha256(value: string): string { + return createHash('sha256').update(value).digest('hex') +} + +async function createTemporaryDirectory(): Promise { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-body-')) + temporaryDirectories.push(directory) + return directory +} + +function createRequest( + chunks: Array, + headers: Record = {} +): IncomingMessage { + const request = Readable.from(chunks) + Object.defineProperties(request, { + headers: { value: headers }, + headersDistinct: { + value: Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, [value]])) + } + }) + return request as IncomingMessage +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('bounded CLI request bodies', () => { + it('keeps small bodies in memory without creating the spill directory', async () => { + const root = await createTemporaryDirectory() + const tempDirectory = path.join(root, 'spill') + const request = createRequest(['{"value":', '42}'], { 'content-length': '12' }) + + const body = await readBoundedRequestBody(request, { + maxBytes: 64, + memoryThresholdBytes: 32, + tempDirectory, + requireContentLength: true + }) + + expect(body).toMatchObject({ kind: 'memory', size: 12, sha256: sha256('{"value":42}') }) + expect(body.kind === 'memory' ? body.bytes.toString('utf8') : '').toBe('{"value":42}') + await expect(stat(tempDirectory)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('spills large bodies to a private file and removes it idempotently', async () => { + const root = await createTemporaryDirectory() + const tempDirectory = path.join(root, 'spill') + const request = createRequest(['12345', '67890'], { 'content-length': '10' }) + + const body = await readBoundedRequestBody(request, { + maxBytes: 16, + memoryThresholdBytes: 4, + tempDirectory, + requireContentLength: true + }) + + expect(body.kind).toBe('file') + if (body.kind !== 'file') throw new Error('Expected a spilled body') + expect(await readFile(body.path, 'utf8')).toBe('1234567890') + expect(body.sha256).toBe(sha256('1234567890')) + if (process.platform !== 'win32') { + expect((await stat(body.path)).mode & 0o777).toBe(0o600) + } + await body.cleanup() + await body.cleanup() + await expect(stat(body.path)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('rejects cumulative overflow and removes a partial spill', async () => { + const root = await createTemporaryDirectory() + const tempDirectory = path.join(root, 'spill') + const request = createRequest(['12345', '6789']) + + await expect( + readBoundedRequestBody(request, { + maxBytes: 8, + memoryThresholdBytes: 4, + tempDirectory, + requireContentLength: false + }) + ).rejects.toMatchObject>({ code: 'body_too_large', httpStatus: 413 }) + expect(await readdir(tempDirectory)).toEqual([]) + }) + + it('requires an exact singular Content-Length for RPC requests', async () => { + const root = await createTemporaryDirectory() + const options = { + maxBytes: 64, + memoryThresholdBytes: 64, + tempDirectory: path.join(root, 'spill'), + requireContentLength: true + } + + await expect(readBoundedRequestBody(createRequest(['{}']), options)).rejects.toMatchObject({ + code: 'invalid_request', + httpStatus: 411 + }) + await expect( + readBoundedRequestBody(createRequest(['{}'], { 'content-length': '3' }), options) + ).rejects.toMatchObject({ code: 'invalid_request' }) + }) + + it('rejects unsafe JSON keys and always releases the body', async () => { + const cleanup = vi.fn(async () => undefined) + + await expect( + parseBoundedJsonBody({ + kind: 'memory', + bytes: Buffer.from('{"nested":{"__proto__":true}}'), + size: 31, + sha256: sha256('{"nested":{"__proto__":true}}'), + cleanup + }) + ).rejects.toMatchObject({ code: 'invalid_request' }) + expect(cleanup).toHaveBeenCalledOnce() + }) + + it('applies the same UTF-8 and shape limits to header JSON', () => { + expect(parseBoundedJsonBytes(Buffer.from('{"value":42}'))).toEqual({ value: 42 }) + expect(() => parseBoundedJsonBytes(Buffer.from([0xc3, 0x28]))).toThrowError( + expect.objectContaining({ code: 'invalid_request' }) + ) + expect(() => parseBoundedJsonBytes(Buffer.from('{"constructor":true}'))).toThrowError( + expect.objectContaining({ code: 'invalid_request' }) + ) + }) +}) diff --git a/test/main/cli/client.test.ts b/test/main/cli/client.test.ts new file mode 100644 index 0000000000..e4e8c13cd5 --- /dev/null +++ b/test/main/cli/client.test.ts @@ -0,0 +1,934 @@ +import { EventEmitter } from 'node:events' +import { mkdtemp, rm } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { Readable } from 'node:stream' +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { DeepchatRouteName } from '@shared/contracts/routes' +import type { JsonValue } from '@shared/contracts/json' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + LocalControlEventEnvelopeSchema, + LocalControlRpcResponseSchema, + type LocalControlDescriptor +} from '@shared/contracts/localControl' +import { createCliRoutes } from '@/cli/routes' +import { CliServer } from '@/cli/server' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import { runCli } from '../../../src/cli/run' + +const servers: CliServer[] = [] +const temporaryDirectories: string[] = [] + +const testDescriptor: LocalControlDescriptor = { + protocolVersion: 1, + surfaceVersion: 1, + appVersion: '9.8.7', + endpoint: { kind: 'unix', path: '/tmp/deepchat-test.sock' }, + pid: 1, + token: 'h'.repeat(43), + startedAt: 1 +} + +function captureOutput(): { stream: NodeJS.WriteStream; read(): string } { + let value = '' + return { + stream: { + write: (chunk: string | Uint8Array) => { + value += typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8') + return true + } + } as NodeJS.WriteStream, + read: () => value + } +} + +async function createClientServer( + options: { + hang?: boolean + hangStream?: boolean + stream?: Readonly<{ events: readonly JsonValue[]; result: unknown }> + } = {} +): Promise<{ + userDataPath: string + server: CliServer + dispatch: ReturnType + dispatchStream: ReturnType +}> { + const userDataPath = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-client-')) + temporaryDirectories.push(userDataPath) + let server: CliServer + const routes = createCliRoutes({ + appVersion: '9.8.7', + getStatus: () => server.getStatus(), + hasTrustedRenderer: () => true + }) + const dispatch = vi.fn( + async (method: string, input: unknown, caller: CliRouteCaller): Promise => { + if (options.hang) return await new Promise(() => undefined) + const route = routes.get(method as DeepchatRouteName) + if (!route) throw new Error(`Unknown test route: ${method}`) + return await route(input, { caller }) + } + ) + const dispatchStream = vi.fn( + async ( + method: string, + _input: unknown, + _caller: CliRouteCaller, + _requestId: string, + _signal: AbortSignal, + emit: (event: string, data: JsonValue) => Promise + ) => { + if (options.hangStream) return await new Promise(() => undefined) + for (const event of options.stream?.events ?? []) await emit(method, event) + return options.stream?.result + } + ) + server = new CliServer({ + userDataPath, + appVersion: '9.8.7', + dispatch, + ...(options.stream || options.hangStream + ? { + dispatchStream + } + : {}), + log: { warn: vi.fn(), error: vi.fn() } + }) + servers.push(server) + await server.start() + return { userDataPath, server, dispatch, dispatchStream } +} + +function runWithCapturedOutput( + argv: readonly string[], + env: NodeJS.ProcessEnv, + stdin?: NodeJS.ReadableStream +): { + result: Promise + stdout: ReturnType + stderr: ReturnType + signalHost: EventEmitter +} { + const stdout = captureOutput() + const stderr = captureOutput() + const signalHost = new EventEmitter() + return { + result: runCli(argv, { + env, + stdout: stdout.stream, + stderr: stderr.stream, + ...(stdin ? { stdin } : {}), + signalHost: signalHost as unknown as NodeJS.Process, + randomId: () => 'request-1', + forceExit: vi.fn() + }), + stdout, + stderr, + signalHost + } +} + +afterEach(async () => { + await Promise.all(servers.splice(0).map((server) => server.stop())) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('bundled CLI client', () => { + it('renders top-level help without discovering a running app', async () => { + const invocation = runWithCapturedOutput(['help'], {}) + + await expect(invocation.result).resolves.toBe(0) + expect(invocation.stdout.read()).toContain('Usage: deepchat [options]') + expect(invocation.stderr.read()).toBe('') + }) + + it('keeps usage failures machine-readable when a post-command mode is valid', async () => { + const invocation = runWithCapturedOutput(['system', 'status', '--json', '--unknown'], {}) + + await expect(invocation.result).resolves.toBe(2) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: false, + error: { code: 'invalid_request' } + } + ) + expect(invocation.stderr.read()).toBe('') + }) + + it('keeps unexpected boundary failures inside the machine error contract', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + + await expect( + runCli(['system', 'status', '--json'], { + env: {}, + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => { + throw new Error('x'.repeat(5_000)) + } + }) + ).resolves.toBe(8) + + const response = LocalControlRpcResponseSchema.parse(JSON.parse(stdout.read())) + expect(response).toMatchObject({ ok: false, error: { code: 'internal_error' } }) + expect(response.ok ? '' : response.error.message).toHaveLength(4_096) + expect(stderr.read()).toBe('') + }) + + it('discovers the running app and renders human output', async () => { + const { userDataPath, dispatch } = await createClientServer() + const invocation = runWithCapturedOutput(['system', 'version'], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath + }) + + await expect(invocation.result).resolves.toBe(0) + expect(invocation.stdout.read()).toContain('DeepChat 9.8.7') + expect(invocation.stdout.read()).toContain('Protocol 1, surface 1') + expect(invocation.stderr.read()).toBe('') + expect(dispatch).toHaveBeenCalledOnce() + }) + + it('emits exactly one canonical envelope in JSON mode', async () => { + const { userDataPath } = await createClientServer() + const invocation = runWithCapturedOutput(['system', 'status', '--json'], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath + }) + + await expect(invocation.result).resolves.toBe(0) + const lines = invocation.stdout.read().trimEnd().split('\n') + expect(lines).toHaveLength(1) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(lines[0]))).toMatchObject({ + id: 'request-1', + ok: true, + result: { running: true } + }) + expect(invocation.stderr.read()).toBe('') + }) + + it('never falls back to the descriptor when Agent token selection fails', async () => { + const { userDataPath, dispatch } = await createClientServer() + const invocation = runWithCapturedOutput(['system', 'status', '--json'], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath, + [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' + }) + + await expect(invocation.result).resolves.toBe(4) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: false, + error: { code: 'authentication_failed' } + } + ) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('aborts the socket and returns the stable timeout exit code', async () => { + const { userDataPath } = await createClientServer({ hang: true }) + const invocation = runWithCapturedOutput(['system', 'status', '--json', '--timeout', '10'], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath + }) + + await expect(invocation.result).resolves.toBe(7) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: false, + error: { code: 'timeout' } + } + ) + }) + + it('cancels once on SIGINT and returns the stable cancellation code', async () => { + const { userDataPath } = await createClientServer({ hang: true }) + const invocation = runWithCapturedOutput(['system', 'status', '--json'], { + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath + }) + invocation.signalHost.emit('SIGINT') + + await expect(invocation.result).resolves.toBe(7) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: false, + error: { code: 'cancelled' } + } + ) + }) + + it('renders streamed model text once and preserves JSONL event records', async () => { + const stream = { + events: [ + { type: 'text_delta', text: 'Hel' }, + { type: 'text_delta', text: 'lo' }, + { type: 'stop', reason: 'complete' } + ], + result: { + providerId: 'provider-1', + modelId: 'model-1', + text: 'Hello', + finishReason: 'complete', + latency: { queueMs: 0, firstEventMs: 1, firstTextMs: 1, totalMs: 10 } + } + } as const + const { userDataPath } = await createClientServer({ stream }) + const environment = { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath } + + const textInvocation = runWithCapturedOutput( + ['model', 'invoke', '--provider', 'provider-1', '--model', 'model-1', '--prompt', 'hello'], + environment + ) + await expect(textInvocation.result).resolves.toBe(0) + expect(textInvocation.stdout.read()).toBe('Hello\n') + + const jsonlInvocation = runWithCapturedOutput( + [ + 'model', + 'invoke', + '--provider', + 'provider-1', + '--model', + 'model-1', + '--prompt', + 'hello', + '--jsonl' + ], + environment + ) + await expect(jsonlInvocation.result).resolves.toBe(0) + const records = jsonlInvocation.stdout + .read() + .trimEnd() + .split('\n') + .map((line) => JSON.parse(line) as Record) + expect(records).toHaveLength(4) + expect(records.slice(0, 3).map((record) => record.sequence)).toEqual([0, 1, 2]) + expect(records[3]).toMatchObject({ ok: true, result: { text: 'Hello' } }) + }) + + it('starts a durable Agent run with bounded stdin and prints its recovery identity', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const invokeRpc = vi.fn(async (invocation) => + LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { + runId: 'run-1', + sessionId: 'run-1', + status: 'generating', + requestId: 'agent-request-1', + messageId: 'message-1', + createdAt: 1_000 + } + }) + ) + + await expect( + runCli(['agent', 'run', '--stdin', '--provider', 'provider-1', '--model', 'model-1'], { + env: {}, + stdin: Readable.from(['Run the benchmark']), + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeRpc + }) + ).resolves.toBe(0) + + expect(invokeRpc).toHaveBeenCalledWith( + expect.objectContaining({ + method: 'sessions.runDetached', + params: { + prompt: 'Run the benchmark', + providerId: 'provider-1', + modelId: 'model-1' + } + }) + ) + expect(stdout.read()).toContain('Run run-1 started (generating)') + expect(stdout.read()).toContain('deepchat run watch --run run-1') + expect(stderr.read()).toBe('') + }) + + it('validates targeted run events and preserves their resume cursors in JSONL', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const invokeStream = vi.fn(async (invocation, onEvent) => { + await onEvent( + LocalControlEventEnvelopeSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + sequence: 0, + timestamp: 1_000, + requestId: invocation.id, + runId: 'run-1', + cursor: 'epoch-1:7', + event: 'sessions.status.changed', + data: { + sessionId: 'run-1', + status: 'idle', + version: 2, + internalSecret: 'do-not-publish' + } + }) + ) + return LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { runId: 'run-1', lastCursor: 'epoch-1:7' } + }) + }) + + await expect( + runCli(['run', 'watch', '--run', 'run-1', '--jsonl'], { + env: {}, + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeStream + }) + ).resolves.toBe(0) + + const records = stdout + .read() + .trimEnd() + .split('\n') + .map((line) => JSON.parse(line) as Record) + expect(records).toHaveLength(2) + expect(records[0]).toMatchObject({ + event: 'sessions.status.changed', + runId: 'run-1', + cursor: 'epoch-1:7' + }) + expect(records[1]).toMatchObject({ + ok: true, + result: { runId: 'run-1', lastCursor: 'epoch-1:7' } + }) + expect(stdout.read()).not.toContain('do-not-publish') + expect(stderr.read()).toBe('') + }) + + it('rejects untargeted run stream records before writing attacker-controlled data', async () => { + const stdout = captureOutput() + const invokeStream = vi.fn(async (invocation, onEvent) => { + await onEvent( + LocalControlEventEnvelopeSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + sequence: 0, + timestamp: 1_000, + requestId: invocation.id, + event: 'chat.stream.failed', + data: { + requestId: 'agent-request-1', + sessionId: 'other-run', + messageId: 'message-1', + failedAt: 1_000, + error: 'untrusted' + } + }) + ) + throw new Error('unreachable') + }) + + await expect( + runCli(['run', 'watch', '--run', 'run-1', '--jsonl'], { + env: {}, + stdout: stdout.stream, + stderr: captureOutput().stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeStream + }) + ).resolves.toBe(8) + + const records = stdout.read().trimEnd().split('\n') + expect(records).toHaveLength(1) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(records[0]))).toMatchObject({ + ok: false, + error: { code: 'internal_error' } + }) + expect(stdout.read()).not.toContain('untrusted') + }) + + it('keeps typed internal events outside the public run stream allowlist', async () => { + const stdout = captureOutput() + const invokeStream = vi.fn(async (invocation, onEvent) => { + await onEvent( + LocalControlEventEnvelopeSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + sequence: 0, + timestamp: 1_000, + requestId: invocation.id, + runId: 'run-1', + cursor: 'epoch-1:8', + event: 'approvals.closed', + data: { + requestId: 'approval-request-1234', + reason: 'approved' + } + }) + ) + throw new Error('unreachable') + }) + + await expect( + runCli(['run', 'watch', '--run', 'run-1', '--jsonl'], { + env: {}, + stdout: stdout.stream, + stderr: captureOutput().stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeStream + }) + ).resolves.toBe(8) + + const response = LocalControlRpcResponseSchema.parse(JSON.parse(stdout.read())) + expect(response).toMatchObject({ ok: false, error: { code: 'internal_error' } }) + expect(stdout.read()).not.toContain('approvals.closed') + }) + + it('neutralizes terminal control characters in human model output', async () => { + const stdout = captureOutput() + const invokeStream = vi.fn(async (invocation, onEvent) => { + await onEvent( + LocalControlEventEnvelopeSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + sequence: 0, + timestamp: 1_000, + requestId: invocation.id, + event: 'models.invoke', + data: { type: 'text_delta', text: '\u001b]52;c;c2VjcmV0\u0007safe\r\u202e' } + }) + ) + return LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { + providerId: 'provider-1', + modelId: 'model-1', + text: 'safe', + finishReason: 'complete', + latency: { queueMs: 0, firstEventMs: 1, firstTextMs: 1, totalMs: 10 } + } + }) + }) + + await expect( + runCli( + ['model', 'invoke', '--provider', 'provider-1', '--model', 'model-1', '--prompt', 'hello'], + { + env: {}, + stdout: stdout.stream, + stderr: captureOutput().stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeStream + } + ) + ).resolves.toBe(0) + + expect(stdout.read()).toContain('safe') + expect( + Array.from(stdout.read()).some((character) => { + const codePoint = character.codePointAt(0) ?? 0 + return ( + codePoint === 0x0d || + (codePoint <= 0x1f && codePoint !== 0x09 && codePoint !== 0x0a) || + (codePoint >= 0x7f && codePoint <= 0x9f) || + (codePoint >= 0x202a && codePoint <= 0x202e) + ) + }) + ).toBe(false) + }) + + it('cancels a stream promptly even when its provider ignores the signal', async () => { + const { userDataPath, server } = await createClientServer({ hangStream: true }) + const invocation = runWithCapturedOutput( + [ + 'model', + 'invoke', + '--provider', + 'provider-1', + '--model', + 'model-1', + '--prompt', + 'hello', + '--json', + '--timeout', + '10' + ], + { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath } + ) + + await expect(invocation.result).resolves.toBe(7) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(invocation.stdout.read()))).toMatchObject( + { + ok: false, + error: { code: 'timeout' } + } + ) + await vi.waitFor(() => expect(server.getStatus().pendingRequests).toBe(0)) + }) + + it('maps media stdin and renders artifact retrieval instructions', async () => { + const artifact = { + id: 'artifact_identifier_123', + requestId: 'request-1', + owner: 'human', + mimeType: 'image/png', + size: 5, + sha256: 'a'.repeat(64), + filename: 'generated-image-1.png', + createdAt: 1_000, + expiresAt: 2_000 + } as const + const stream = { + events: [ + { type: 'started', providerId: 'provider-1', modelId: 'image-1' }, + { type: 'artifact', index: 0, artifact } + ], + result: { + providerId: 'provider-1', + modelId: 'image-1', + artifacts: [artifact], + durationMs: 25 + } + } as const + const { userDataPath, dispatchStream } = await createClientServer({ stream }) + const invocation = runWithCapturedOutput( + ['image', 'generate', '--provider', 'provider-1', '--model', 'image-1', '--stdin'], + { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath }, + Readable.from(['a lighthouse']) + ) + + await expect(invocation.result).resolves.toBe(0) + expect(invocation.stdout.read()).toContain('Generated 1 image artifact in 25ms') + expect(invocation.stdout.read()).toContain( + 'deepchat artifact get --id artifact_identifier_123 --out generated-image-1.png' + ) + expect(dispatchStream).toHaveBeenCalledWith( + 'images.generate', + { + providerId: 'provider-1', + modelId: 'image-1', + prompt: 'a lighthouse' + }, + expect.objectContaining({ principal: 'human' }), + 'request-1', + expect.any(AbortSignal), + expect.any(Function) + ) + }) + + it('rejects invalid media events before emitting JSONL records', async () => { + const stream = { + events: [{ type: 'artifact', index: -1, artifact: {} }], + result: {} + } as const + const { userDataPath } = await createClientServer({ stream }) + const invocation = runWithCapturedOutput( + [ + 'audio', + 'speak', + '--provider', + 'provider-1', + '--model', + 'tts-1', + '--text', + 'hello', + '--jsonl' + ], + { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath } + ) + + await expect(invocation.result).resolves.toBe(8) + const records = invocation.stdout + .read() + .trimEnd() + .split('\n') + .map((line) => LocalControlRpcResponseSchema.parse(JSON.parse(line))) + expect(records).toHaveLength(1) + expect(records[0]).toMatchObject({ ok: false, error: { code: 'internal_error' } }) + }) + + it('uploads human audio input with only typed metadata in the RPC envelope', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const invokeUpload = vi.fn(async (invocation) => + LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { + providerId: 'provider-1', + modelId: 'whisper-1', + text: 'meeting transcript', + truncated: false, + inputBytes: 10, + mimeType: 'audio/mpeg', + durationMs: 25 + } + }) + ) + + await expect( + runCli( + [ + 'audio', + 'transcribe', + '--provider', + 'provider-1', + '--model', + 'whisper-1', + '--file', + '/private/input/meeting.mp3' + ], + { + env: {}, + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeUpload + } + ) + ).resolves.toBe(0) + + expect(stdout.read()).toBe('meeting transcript\n') + expect(stderr.read()).toBe('') + expect(invokeUpload).toHaveBeenCalledWith( + expect.objectContaining({ + method: 'audio.transcribeUpload', + params: { + providerId: 'provider-1', + modelId: 'whisper-1', + mimeType: 'audio/mpeg', + filename: 'meeting.mp3' + }, + filePath: '/private/input/meeting.mp3', + maxBytes: 25 * 1024 * 1024 + }) + ) + }) + + it('rejects Agent --file input before the upload transport can open it', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const invokeUpload = vi.fn() + + await expect( + runCli(['ocr', 'extract', '--file', '/private/input/scan.png', '--json'], { + env: { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: 'a'.repeat(43) }, + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeUpload + }) + ).resolves.toBe(4) + + expect(LocalControlRpcResponseSchema.parse(JSON.parse(stdout.read()))).toMatchObject({ + ok: false, + error: { code: 'permission_denied' } + }) + expect(stderr.read()).toBe('') + expect(invokeUpload).not.toHaveBeenCalled() + }) + + it('reads provider credentials from bounded stdin instead of argv', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const invokeRpc = vi.fn(async (invocation) => + LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { + providerId: 'provider-1', + action: 'set', + kind: 'api-key', + storedApiKeyConfigured: true + } + }) + ) + + await expect( + runCli(['provider', 'set-credential', '--provider', 'provider-1', '--stdin'], { + env: {}, + stdin: Readable.from([' super-secret \n']), + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeRpc + }) + ).resolves.toBe(0) + + expect(invokeRpc).toHaveBeenCalledWith( + expect.objectContaining({ + method: 'providers.setCredential', + params: { + providerId: 'provider-1', + action: 'set', + kind: 'api-key', + value: ' super-secret ' + } + }) + ) + expect(stdout.read()).toBe('Stored api-key credential for provider-1\n') + expect(stdout.read()).not.toContain('super-secret') + expect(stderr.read()).toBe('') + }) + + it('parses model configuration JSON from stdin before invoking the typed route', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const config = { + maxTokens: 4096, + contextLength: 32768, + vision: false, + functionCall: true, + reasoning: true, + type: 'chat' + } + const invokeRpc = vi.fn(async (invocation) => + LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { config } + }) + ) + + await expect( + runCli(['model', 'config-set', '--provider', 'provider-1', '--model', 'model-1', '--stdin'], { + env: {}, + stdin: Readable.from([JSON.stringify(config)]), + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeRpc + }) + ).resolves.toBe(0) + + expect(invokeRpc).toHaveBeenCalledWith( + expect.objectContaining({ + method: 'models.setPublicConfig', + params: { providerId: 'provider-1', modelId: 'model-1', config } + }) + ) + expect(JSON.parse(stdout.read())).toEqual(config) + expect(stderr.read()).toBe('') + }) + + it('injects bounded MCP configuration JSON under the typed route field', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const config = { + type: 'stdio', + command: 'npx', + args: ['server-package'], + environment: { SERVER_TOKEN: 'private-value' } + } + const invokeRpc = vi.fn(async (invocation) => + LocalControlRpcResponseSchema.parse({ + protocolVersion: 1, + surfaceVersion: 1, + id: invocation.id, + ok: true, + result: { + server: { + name: 'local-server', + type: 'stdio', + enabled: false, + running: false, + managedBy: 'user', + editable: true, + removable: true, + description: '', + commandName: 'npx', + endpoint: null, + argumentCount: 1, + environmentEntryCount: 1, + headerEntryCount: 0, + authorizationMode: null, + metadataTruncated: false + } + } + }) + ) + + await expect( + runCli(['mcp', 'add', '--name', 'local-server', '--stdin'], { + env: {}, + stdin: Readable.from([JSON.stringify(config)]), + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeRpc + }) + ).resolves.toBe(0) + + expect(invokeRpc).toHaveBeenCalledWith( + expect.objectContaining({ + method: 'mcp.addPublic', + params: { + serverName: 'local-server', + config: { + ...config, + description: '', + icon: '', + inheritEnv: 'minimal' + } + } + }) + ) + expect(stdout.read()).toBe('local-server added; disabled; runtime stopped\n') + expect(stdout.read()).not.toContain('private-value') + expect(stderr.read()).toBe('') + }) + + it('rejects non-object MCP stdin before transport invocation', async () => { + const stdout = captureOutput() + const stderr = captureOutput() + const invokeRpc = vi.fn() + + await expect( + runCli(['mcp', 'update', '--name', 'local-server', '--stdin', '--json'], { + env: {}, + stdin: Readable.from(['[]']), + stdout: stdout.stream, + stderr: stderr.stream, + randomId: () => 'request-1', + loadDescriptor: async () => testDescriptor, + invokeRpc + }) + ).resolves.toBe(2) + + expect(LocalControlRpcResponseSchema.parse(JSON.parse(stdout.read()))).toMatchObject({ + ok: false, + error: { code: 'invalid_request' } + }) + expect(stderr.read()).toBe('') + expect(invokeRpc).not.toHaveBeenCalled() + }) +}) diff --git a/test/main/cli/computeService.test.ts b/test/main/cli/computeService.test.ts new file mode 100644 index 0000000000..9696598fa2 --- /dev/null +++ b/test/main/cli/computeService.test.ts @@ -0,0 +1,664 @@ +import { mkdtemp, readdir, rm } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { + imagesGenerateRoute, + modelsInvokeRoute, + speechGenerateRoute, + videosGenerateRoute, + type MediaGenerationEvent, + type ModelInvokeEvent +} from '@shared/contracts/routes' +import { ModelType } from '@shared/model' +import type { LLMCoreStreamEvent } from '@shared/types/core/llm-events' +import type { MODEL_META, ModelConfig } from '@shared/types/provider' +import { CliComputeService, type CliComputeServiceOptions } from '@/cli/computeService' +import { ArtifactSpool } from '@/cli/artifactSpool' +import type { CliRouteCaller } from '@/routes/routeRegistry' + +const mediaSpools: ArtifactSpool[] = [] +const temporaryDirectories: string[] = [] + +const provider = { + id: 'provider-1', + name: 'Provider One', + apiType: 'openai-compatible', + apiKey: 'secret-key', + baseUrl: 'https://private.example', + enable: true, + custom: true +} + +const model: MODEL_META = { + id: 'model-1', + name: 'Model One', + group: 'default', + providerId: provider.id, + type: ModelType.Chat +} + +const modelConfig: ModelConfig = { + maxTokens: 4_096, + contextLength: 32_768, + temperature: 0.7, + vision: false, + functionCall: true, + reasoning: true, + type: ModelType.Chat +} + +const caller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['models:invoke', 'media:generate'] +} + +afterEach(async () => { + await Promise.allSettled(mediaSpools.splice(0).map((spool) => spool.close())) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +async function* streamEvents( + events: readonly LLMCoreStreamEvent[] +): AsyncGenerator { + for (const event of events) yield event +} + +function createService( + events: readonly LLMCoreStreamEvent[], + options: { + now?: () => number + providerRuntime?: Partial + } = {} +) { + const providerSettings: CliComputeServiceOptions['providerSettings'] = { + getProviders: vi.fn(() => [provider]), + getProviderById: vi.fn(() => provider), + getProviderModels: vi.fn(() => [model]), + getCustomModels: vi.fn(() => []), + getBatchModelStatus: vi.fn(() => ({ [model.id]: true })), + getModelStatus: vi.fn(() => true), + isKnownModel: vi.fn(() => true), + getModelConfig: vi.fn(() => modelConfig) + } + const providerRuntime: CliComputeServiceOptions['providerRuntime'] = { + executeWithRateLimit: vi.fn(async () => undefined), + streamChat: vi.fn(() => streamEvents(events)), + ...options.providerRuntime + } + const log = { warn: vi.fn() } + return { + service: new CliComputeService({ + providerSettings, + providerRuntime, + log, + now: options.now ?? (() => 100) + }), + providerSettings, + providerRuntime, + log + } +} + +async function createMediaService( + type: ModelType, + overrides: Partial = {} +) { + const root = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-compute-')) + temporaryDirectories.push(root) + const artifactDirectory = path.join(root, 'artifacts') + const mediaCacheDirectory = path.join(root, 'images') + const artifactSpool = new ArtifactSpool({ directory: artifactDirectory }) + mediaSpools.push(artifactSpool) + const mediaModel = { ...model, id: `${type}-model`, type } + const mediaConfig = { ...modelConfig, type } + const providerSettings: CliComputeServiceOptions['providerSettings'] = { + getProviders: vi.fn(() => [provider]), + getProviderById: vi.fn(() => provider), + getProviderModels: vi.fn(() => [mediaModel]), + getCustomModels: vi.fn(() => []), + getBatchModelStatus: vi.fn(() => ({ [mediaModel.id]: true })), + getModelStatus: vi.fn(() => true), + isKnownModel: vi.fn(() => true), + getModelConfig: vi.fn(() => mediaConfig) + } + const providerRuntime: CliComputeServiceOptions['providerRuntime'] = { + executeWithRateLimit: vi.fn(async () => undefined), + streamChat: vi.fn(() => streamEvents([])), + generateImageStandalone: vi.fn(async (providerId, _prompt, modelId) => ({ + providerId, + modelId, + images: [{ data: 'aW1hZ2U=', mimeType: 'image/png' }] + })), + generateVideoStandalone: vi.fn(async (providerId, _prompt, modelId) => ({ + providerId, + modelId, + videos: [{ data: 'dmlkZW8=', mimeType: 'video/mp4' }] + })), + generateSpeechStandalone: vi.fn(async (providerId, _text, modelId) => ({ + providerId, + modelId, + audio: { data: 'YXVkaW8=', mimeType: 'audio/mpeg' } + })), + ...overrides + } + const log = { warn: vi.fn() } + return { + service: new CliComputeService({ + providerSettings, + providerRuntime, + artifactSpool, + mediaCacheDirectory, + log, + now: () => 100 + }), + artifactSpool, + artifactDirectory, + mediaModel, + providerRuntime, + log + } +} + +async function collectArtifact(spool: ArtifactSpool, id: string): Promise { + const opened = await spool.openRead(id, caller) + const chunks: Buffer[] = [] + for await (const chunk of opened.stream) chunks.push(Buffer.from(chunk)) + return Buffer.concat(chunks) +} + +describe('CLI compute service', () => { + it('returns an explicitly redacted provider and model view', () => { + const { service } = createService([]) + + const result = service.listPublicProviders() + + expect(result).toEqual([ + { + id: 'provider-1', + name: 'Provider One', + apiType: 'openai-compatible', + enabled: true, + custom: true, + storedCredentialConfigured: true, + models: [ + { + id: 'model-1', + name: 'Model One', + group: 'default', + enabled: true, + custom: false, + vision: false, + functionCall: false, + reasoning: false, + enableSearch: false, + type: ModelType.Chat + } + ] + } + ]) + expect(JSON.stringify(result)).not.toContain('secret-key') + expect(JSON.stringify(result)).not.toContain('private.example') + }) + + it('streams only typed raw-model events and never enables tools', async () => { + const timestamps = [0, 5, 25, 40, 80] + const { service, providerRuntime } = createService( + [ + { type: 'text', content: 'Hel' }, + { type: 'text', content: '' }, + { type: 'reasoning', reasoning_content: 'Think' }, + { type: 'text', content: 'lo' }, + { + type: 'usage', + usage: { prompt_tokens: 2, completion_tokens: 3, total_tokens: 5 } + }, + { type: 'stop', stop_reason: 'complete' } + ], + { now: () => timestamps.shift() ?? 80 } + ) + const emitted: ModelInvokeEvent[] = [] + const signal = new AbortController().signal + + const result = await service.dispatchStream( + modelsInvokeRoute.name, + { + providerId: provider.id, + modelId: model.id, + messages: [{ role: 'user', content: 'hello' }] + }, + caller, + 'request-1', + signal, + async (event, data) => { + expect(event).toBe(modelsInvokeRoute.name) + emitted.push(data as ModelInvokeEvent) + } + ) + + expect(result).toMatchObject({ + providerId: provider.id, + modelId: model.id, + text: 'Hello', + reasoning: 'Think', + usage: { totalTokens: 5 }, + finishReason: 'complete', + latency: { queueMs: 20, firstEventMs: 40, firstTextMs: 40, totalMs: 80 } + }) + expect(emitted.map((event) => event.type)).toEqual([ + 'text_delta', + 'reasoning_delta', + 'text_delta', + 'usage', + 'stop' + ]) + const streamCall = vi.mocked(providerRuntime.streamChat).mock.calls[0] + expect(streamCall?.[6]).toEqual([]) + expect(streamCall?.[7]).toEqual({ signal }) + }) + + it('serializes repeated rate-limit queue events before model output', async () => { + const releases: Array<() => void> = [] + const startedQueueLengths: number[] = [] + let activeEmissions = 0 + let maxActiveEmissions = 0 + const { service } = createService([{ type: 'stop', stop_reason: 'complete' }], { + providerRuntime: { + executeWithRateLimit: vi.fn(async (_providerId, options) => { + options?.onQueued?.({ + providerId: provider.id, + qpsLimit: 1, + currentQps: 1, + queueLength: 2, + estimatedWaitTime: 20 + }) + options?.onQueued?.({ + providerId: provider.id, + qpsLimit: 1, + currentQps: 1, + queueLength: 1, + estimatedWaitTime: 10 + }) + }) + } + }) + + const invocation = service.dispatchStream( + modelsInvokeRoute.name, + { + providerId: provider.id, + modelId: model.id, + messages: [{ role: 'user', content: 'hello' }] + }, + caller, + 'request-queued', + new AbortController().signal, + async (_event, data) => { + const event = data as ModelInvokeEvent + if (event.type !== 'rate_limit') return + activeEmissions += 1 + maxActiveEmissions = Math.max(maxActiveEmissions, activeEmissions) + startedQueueLengths.push(event.queueLength) + await new Promise((resolve) => releases.push(resolve)) + activeEmissions -= 1 + } + ) + + await vi.waitFor(() => expect(releases).toHaveLength(1)) + expect(startedQueueLengths).toEqual([2]) + releases.shift()?.() + await vi.waitFor(() => expect(releases).toHaveLength(1)) + expect(startedQueueLengths).toEqual([2, 1]) + releases.shift()?.() + + await expect(invocation).resolves.toMatchObject({ finishReason: 'complete' }) + expect(maxActiveEmissions).toBe(1) + }) + + it('drains queued events before propagating an admission failure', async () => { + let releaseEmission!: () => void + const emissionGate = new Promise((resolve) => { + releaseEmission = resolve + }) + let emissionStarted = false + let emissionFinished = false + const { service, providerRuntime } = createService([], { + providerRuntime: { + executeWithRateLimit: vi.fn(async (_providerId, options) => { + options?.onQueued?.({ + providerId: provider.id, + qpsLimit: 1, + currentQps: 1, + queueLength: 1, + estimatedWaitTime: 10 + }) + throw new Error('Rate-limit admission failed') + }) + } + }) + + const invocation = service.dispatchStream( + modelsInvokeRoute.name, + { + providerId: provider.id, + modelId: model.id, + messages: [{ role: 'user', content: 'hello' }] + }, + caller, + 'request-admission-failure', + new AbortController().signal, + async (_event, data) => { + if ((data as ModelInvokeEvent).type !== 'rate_limit') return + emissionStarted = true + await emissionGate + emissionFinished = true + } + ) + let settled = false + void invocation.then( + () => { + settled = true + }, + () => { + settled = true + } + ) + + await vi.waitFor(() => expect(emissionStarted).toBe(true)) + await Promise.resolve() + expect(settled).toBe(false) + releaseEmission() + + await expect(invocation).rejects.toMatchObject({ code: 'unavailable' }) + expect(emissionFinished).toBe(true) + expect(providerRuntime.streamChat).not.toHaveBeenCalled() + }) + + it('exposes normalized provider failure metadata without upstream text or headers', async () => { + const { service, log } = createService([ + { + type: 'error', + error_message: 'secret upstream response', + failure: { + statusCode: 401, + code: 'SECRET_PROVIDER_CODE', + retryable: false, + retryHeaders: { 'retry-after': 'secret-header-value' } + } + } + ]) + + await expect( + service.dispatchStream( + modelsInvokeRoute.name, + { + providerId: provider.id, + modelId: model.id, + messages: [{ role: 'user', content: 'hello' }] + }, + caller, + 'request-1', + new AbortController().signal, + async () => undefined + ) + ).rejects.toMatchObject({ + code: 'unavailable', + message: 'Model provider request failed', + retriable: false, + options: { + details: { providerFailure: { statusCode: 401, retryable: false } } + } + }) + expect(log.warn).toHaveBeenCalledOnce() + const serializedLog = JSON.stringify(log.warn.mock.calls) + expect(serializedLog).not.toContain('secret upstream response') + expect(serializedLog).not.toContain('SECRET_PROVIDER_CODE') + expect(serializedLog).not.toContain('secret-header-value') + }) + + it('rejects tool events instead of turning raw invocation into an Agent run', async () => { + const { service } = createService([ + { type: 'tool_call_start', tool_call_id: 'call-1', tool_call_name: 'dangerous_tool' } + ]) + + await expect( + service.dispatchStream( + modelsInvokeRoute.name, + { + providerId: provider.id, + modelId: model.id, + messages: [{ role: 'user', content: 'hello' }] + }, + caller, + 'request-1', + new AbortController().signal, + async () => undefined + ) + ).rejects.toMatchObject({ + code: 'conflict', + message: 'Raw model invocation returned an unsupported event' + }) + }) + + it('persists generated images and emits artifacts only after publication', async () => { + const { service, artifactSpool, mediaModel, providerRuntime } = await createMediaService( + ModelType.ImageGeneration + ) + const emitted: MediaGenerationEvent[] = [] + const signal = new AbortController().signal + + const result = await service.dispatchStream( + imagesGenerateRoute.name, + { + providerId: provider.id, + modelId: mediaModel.id, + prompt: 'a lighthouse', + options: { quality: 'high', outputFormat: 'png' } + }, + caller, + 'request-image', + signal, + async (event, data) => { + expect(event).toBe(imagesGenerateRoute.name) + emitted.push(data as MediaGenerationEvent) + } + ) + + expect(result).toMatchObject({ + providerId: provider.id, + modelId: mediaModel.id, + requestedOptions: { quality: 'high', outputFormat: 'png' }, + artifacts: [{ owner: 'human', mimeType: 'image/png', filename: 'generated-image-1.png' }] + }) + expect(emitted.map((event) => event.type)).toEqual(['started', 'artifact']) + const artifact = imagesGenerateRoute.output.parse(result).artifacts[0] + expect(await collectArtifact(artifactSpool, artifact.id)).toEqual(Buffer.from('image')) + expect(providerRuntime.generateImageStandalone).toHaveBeenCalledWith( + provider.id, + 'a lighthouse', + mediaModel.id, + { quality: 'high', outputFormat: 'png' }, + { signal } + ) + }) + + it('persists video and speech results with typed media artifacts', async () => { + const video = await createMediaService(ModelType.VideoGeneration) + const videoResult = await video.service.dispatchStream( + videosGenerateRoute.name, + { + providerId: provider.id, + modelId: video.mediaModel.id, + prompt: 'ocean waves', + options: { duration: 8, generateAudio: true } + }, + caller, + 'request-video', + new AbortController().signal, + async () => undefined + ) + const videoArtifact = videosGenerateRoute.output.parse(videoResult).artifacts[0] + expect(videoArtifact).toMatchObject({ + mimeType: 'video/mp4', + filename: 'generated-video-1.mp4' + }) + expect(await collectArtifact(video.artifactSpool, videoArtifact.id)).toEqual( + Buffer.from('video') + ) + + const speech = await createMediaService(ModelType.TTS) + const speechResult = await speech.service.dispatchStream( + speechGenerateRoute.name, + { + providerId: provider.id, + modelId: speech.mediaModel.id, + text: 'hello', + options: { voice: 'alloy', responseFormat: 'mp3' } + }, + caller, + 'request-speech', + new AbortController().signal, + async () => undefined + ) + const speechArtifact = speechGenerateRoute.output.parse(speechResult).artifacts[0] + expect(speechArtifact).toMatchObject({ + mimeType: 'audio/mpeg', + filename: 'generated-audio-1.mp3' + }) + expect(await collectArtifact(speech.artifactSpool, speechArtifact.id)).toEqual( + Buffer.from('audio') + ) + }) + + it('rejects mismatched provider identity before publishing media', async () => { + const media = await createMediaService(ModelType.ImageGeneration, { + generateImageStandalone: vi.fn(async (_providerId, _prompt, modelId) => ({ + providerId: 'different-provider', + modelId, + images: [{ data: 'aW1hZ2U=', mimeType: 'image/png' }] + })) + }) + + await expect( + media.service.dispatchStream( + imagesGenerateRoute.name, + { + providerId: provider.id, + modelId: media.mediaModel.id, + prompt: 'hello' + }, + caller, + 'request-mismatch', + new AbortController().signal, + async () => undefined + ) + ).rejects.toMatchObject({ + code: 'unavailable', + message: 'Provider returned inconsistent media output' + }) + }) + + it('rejects media requests whose model is configured for another capability', async () => { + const media = await createMediaService(ModelType.TTS) + + await expect( + media.service.dispatchStream( + imagesGenerateRoute.name, + { + providerId: provider.id, + modelId: media.mediaModel.id, + prompt: 'hello' + }, + caller, + 'request-wrong-model', + new AbortController().signal, + async () => undefined + ) + ).rejects.toMatchObject({ code: 'conflict' }) + expect(media.providerRuntime.generateImageStandalone).not.toHaveBeenCalled() + }) + + it('removes earlier artifacts when a later provider output is invalid', async () => { + const media = await createMediaService(ModelType.ImageGeneration, { + generateImageStandalone: vi.fn(async (providerId, _prompt, modelId) => ({ + providerId, + modelId, + images: [ + { data: 'Zmlyc3Q=', mimeType: 'image/png' }, + { data: 'invalid base64', mimeType: 'image/png' } + ] + })) + }) + + await expect( + media.service.dispatchStream( + imagesGenerateRoute.name, + { + providerId: provider.id, + modelId: media.mediaModel.id, + prompt: 'hello' + }, + caller, + 'request-partial', + new AbortController().signal, + async () => undefined + ) + ).rejects.toMatchObject({ code: 'unavailable' }) + expect(await readdir(media.artifactDirectory)).toEqual([]) + }) + + it('discards published artifacts when stream delivery fails', async () => { + const media = await createMediaService(ModelType.ImageGeneration) + + await expect( + media.service.dispatchStream( + imagesGenerateRoute.name, + { + providerId: provider.id, + modelId: media.mediaModel.id, + prompt: 'hello' + }, + caller, + 'request-delivery-failure', + new AbortController().signal, + async (_event, data) => { + if ((data as MediaGenerationEvent).type === 'artifact') { + throw new Error('stream disconnected') + } + } + ) + ).rejects.toMatchObject({ code: 'unavailable' }) + expect(await readdir(media.artifactDirectory)).toEqual([]) + }) + + it('normalizes media failures without logging provider response text', async () => { + const media = await createMediaService(ModelType.TTS, { + generateSpeechStandalone: vi.fn(async () => { + throw new Error('secret upstream media response') + }) + }) + + await expect( + media.service.dispatchStream( + speechGenerateRoute.name, + { + providerId: provider.id, + modelId: media.mediaModel.id, + text: 'hello' + }, + caller, + 'request-error', + new AbortController().signal, + async () => undefined + ) + ).rejects.toMatchObject({ code: 'unavailable', message: 'Speech generation failed' }) + expect(media.log.warn).toHaveBeenCalledOnce() + expect(JSON.stringify(media.log.warn.mock.calls)).not.toContain( + 'secret upstream media response' + ) + }) +}) diff --git a/test/main/cli/descriptor.test.ts b/test/main/cli/descriptor.test.ts new file mode 100644 index 0000000000..e542b28573 --- /dev/null +++ b/test/main/cli/descriptor.test.ts @@ -0,0 +1,142 @@ +import { createServer, type Server } from 'node:net' +import { lstat, mkdir, mkdtemp, readFile, readdir, rm, stat, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { LocalControlDescriptorSchema } from '@shared/contracts/localControl' +import { + cleanupLocalControlLayout, + createLocalControlLayout, + prepareLocalControlLayout, + writeLocalControlDescriptor +} from '@/cli/descriptor' + +const temporaryDirectories: string[] = [] + +async function createTemporaryDirectory(): Promise { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-descriptor-')) + temporaryDirectories.push(directory) + return directory +} + +async function listenOnUnixSocket(socketPath: string): Promise { + const server = createServer() + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(socketPath, resolve) + }) + return server +} + +async function closeServer(server: Server): Promise { + await new Promise((resolve) => server.close(() => resolve())) +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe.skipIf(process.platform === 'win32')('CLI discovery descriptor', () => { + it('writes a private validated descriptor and cleans matching state', async () => { + const userDataPath = await createTemporaryDirectory() + const layout = createLocalControlLayout(userDataPath, 'darwin') + await prepareLocalControlLayout(layout, 'darwin') + + const descriptor = await writeLocalControlDescriptor( + layout, + { + appVersion: '1.2.3', + endpoint: layout.endpoint, + pid: 42, + token: 'a'.repeat(43), + startedAt: 1 + }, + 'darwin' + ) + + expect( + LocalControlDescriptorSchema.parse(JSON.parse(await readFile(layout.descriptorPath, 'utf8'))) + ).toEqual(descriptor) + expect((await stat(layout.controlDirectory)).mode & 0o777).toBe(0o700) + expect((await stat(layout.descriptorPath)).mode & 0o777).toBe(0o600) + + await cleanupLocalControlLayout(layout, descriptor.token) + await expect(stat(layout.descriptorPath)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('removes only owned request-body remnants from the private temp directory', async () => { + const userDataPath = await createTemporaryDirectory() + const layout = createLocalControlLayout(userDataPath, 'darwin') + await prepareLocalControlLayout(layout, 'darwin') + await writeFile( + path.join(layout.tempDirectory, 'body-123e4567-e89b-42d3-a456-426614174000.tmp'), + 'partial' + ) + await writeFile(path.join(layout.tempDirectory, 'keep.tmp'), 'foreign') + + await prepareLocalControlLayout(layout, 'darwin') + + expect(await readdir(layout.tempDirectory)).toEqual(['keep.tmp']) + }) + + it('refuses a non-socket endpoint without deleting discovery state', async () => { + const userDataPath = await createTemporaryDirectory() + const layout = createLocalControlLayout(userDataPath, 'darwin') + if (layout.endpoint.kind !== 'unix') throw new Error('Expected a Unix endpoint') + await mkdir(layout.controlDirectory, { recursive: true }) + await mkdir(layout.endpointDirectory, { recursive: true }) + await writeFile(layout.descriptorPath, 'keep-me') + await writeFile(layout.endpoint.path, 'not-a-socket') + + await expect(prepareLocalControlLayout(layout, 'darwin')).rejects.toThrow( + 'Refusing to replace a non-socket' + ) + expect(await readFile(layout.descriptorPath, 'utf8')).toBe('keep-me') + }) + + it('cleans its socket when the descriptor is malformed', async () => { + const userDataPath = await createTemporaryDirectory() + const layout = createLocalControlLayout(userDataPath, 'darwin') + if (layout.endpoint.kind !== 'unix') throw new Error('Expected a Unix endpoint') + await prepareLocalControlLayout(layout, 'darwin') + const server = await listenOnUnixSocket(layout.endpoint.path) + await writeFile(layout.descriptorPath, '{broken-json') + + try { + await cleanupLocalControlLayout(layout, 'a'.repeat(43)) + await expect(lstat(layout.endpoint.path)).rejects.toMatchObject({ code: 'ENOENT' }) + expect(await readFile(layout.descriptorPath, 'utf8')).toBe('{broken-json') + } finally { + await closeServer(server) + } + }) + + it('does not remove an endpoint claimed by a different valid descriptor', async () => { + const userDataPath = await createTemporaryDirectory() + const layout = createLocalControlLayout(userDataPath, 'darwin') + if (layout.endpoint.kind !== 'unix') throw new Error('Expected a Unix endpoint') + await prepareLocalControlLayout(layout, 'darwin') + const server = await listenOnUnixSocket(layout.endpoint.path) + await writeLocalControlDescriptor( + layout, + { + appVersion: '1.2.3', + endpoint: layout.endpoint, + pid: 42, + token: 'b'.repeat(43), + startedAt: 1 + }, + 'darwin' + ) + + try { + await cleanupLocalControlLayout(layout, 'a'.repeat(43)) + expect((await lstat(layout.endpoint.path)).isSocket()).toBe(true) + expect((await stat(layout.descriptorPath)).isFile()).toBe(true) + } finally { + await closeServer(server) + } + }) +}) diff --git a/test/main/cli/discovery.test.ts b/test/main/cli/discovery.test.ts new file mode 100644 index 0000000000..39f7847563 --- /dev/null +++ b/test/main/cli/discovery.test.ts @@ -0,0 +1,94 @@ +import { chmod, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + LOCAL_CONTROL_DESCRIPTOR_FILENAME, + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION, + type LocalControlDescriptor +} from '@shared/contracts/localControl' +import { + loadLocalControlDescriptor, + resolveCliUserDataPath, + selectLocalControlToken +} from '../../../src/cli/discovery' + +const temporaryDirectories: string[] = [] + +async function createTemporaryDirectory(): Promise { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-discovery-')) + temporaryDirectories.push(directory) + return directory +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('CLI descriptor discovery', () => { + it('mirrors Electron default and explicit profile paths', () => { + expect( + resolveCliUserDataPath({ platform: 'darwin', homeDirectory: '/Users/test', env: {} }) + ).toBe('/Users/test/Library/Application Support/DeepChat') + expect( + resolveCliUserDataPath({ platform: 'linux', homeDirectory: '/home/test', env: {} }) + ).toBe('/home/test/.config/DeepChat') + expect( + resolveCliUserDataPath({ + platform: 'win32', + homeDirectory: 'C:\\Users\\test', + env: { APPDATA: 'D:\\Profiles' } + }) + ).toBe(path.join('D:\\Profiles', 'DeepChat')) + expect( + resolveCliUserDataPath({ + env: { DEEPCHAT_E2E_USER_DATA_DIR: ' ./profile ' }, + homeDirectory: '/unused' + }) + ).toBe(path.resolve('./profile')) + }) + + it('fails closed when an Agent token variable is present but invalid', () => { + const descriptor = { token: 'h'.repeat(43) } as LocalControlDescriptor + + expect(selectLocalControlToken(descriptor, {})).toBe('h'.repeat(43)) + expect( + selectLocalControlToken(descriptor, { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: 'a'.repeat(43) }) + ).toBe('a'.repeat(43)) + expect(() => + selectLocalControlToken(descriptor, { [LOCAL_CONTROL_AGENT_TOKEN_ENV]: '' }) + ).toThrow('refusing human-token fallback') + }) + + it('reports incompatible descriptor versions before connecting', async () => { + const userDataPath = await createTemporaryDirectory() + const controlDirectory = path.join(userDataPath, 'local-control') + const descriptorPath = path.join(controlDirectory, LOCAL_CONTROL_DESCRIPTOR_FILENAME) + await mkdir(controlDirectory, { recursive: true }) + await writeFile( + descriptorPath, + JSON.stringify({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION + 1, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + appVersion: '2.0.0', + endpoint: { kind: 'unix', path: '/tmp/deepchat.sock' }, + pid: process.pid, + token: 't'.repeat(43), + startedAt: Date.now() + }), + { mode: 0o600 } + ) + if (process.platform !== 'win32') await chmod(descriptorPath, 0o600) + + await expect( + loadLocalControlDescriptor({ + env: { DEEPCHAT_E2E_USER_DATA_DIR: userDataPath }, + processAlive: () => true + }) + ).rejects.toMatchObject({ code: 'unsupported_version', exitCode: 3 }) + }) +}) diff --git a/test/main/cli/errors.test.ts b/test/main/cli/errors.test.ts new file mode 100644 index 0000000000..aba40272d9 --- /dev/null +++ b/test/main/cli/errors.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest' +import { LocalControlErrorSchema, type LocalControlErrorCode } from '@shared/contracts/localControl' +import { CLI_EXIT_CODES, exitCodeForRemoteError } from '../../../src/cli/errors' + +const error = (code: LocalControlErrorCode) => + LocalControlErrorSchema.parse({ + code, + message: code, + retriable: false + }) + +describe('CLI exit codes', () => { + it('keeps the public numeric contract stable', () => { + expect(CLI_EXIT_CODES).toEqual({ + success: 0, + usage: 2, + unavailable: 3, + authorization: 4, + approval: 5, + domain: 6, + cancelled: 7, + internal: 8 + }) + }) + + it.each([ + ['invalid_request', 2], + ['unsupported_version', 3], + ['unavailable', 3], + ['authentication_failed', 4], + ['permission_denied', 4], + ['approval_denied', 5], + ['approval_timeout', 5], + ['not_found', 6], + ['conflict', 6], + ['rate_limited', 6], + ['cancelled', 7], + ['timeout', 7], + ['internal_error', 8] + ] as const)('maps %s to exit %i', (code, expected) => { + expect(exitCodeForRemoteError(error(code))).toBe(expected) + }) +}) diff --git a/test/main/cli/inputCapabilityServices.test.ts b/test/main/cli/inputCapabilityServices.test.ts new file mode 100644 index 0000000000..ce0c320541 --- /dev/null +++ b/test/main/cli/inputCapabilityServices.test.ts @@ -0,0 +1,427 @@ +import { mkdtemp, rm, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { + AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS, + audioTranscribeArtifactRoute, + audioTranscribeUploadRoute, + ocrExtractUploadRoute +} from '@shared/contracts/routes' +import { ArtifactSpool } from '@/cli/artifactSpool' +import { + CliAudioTranscriptionService, + type CliAudioTranscriptionServiceOptions +} from '@/cli/audioTranscriptionService' +import { CliOcrService, type CliOcrServiceOptions } from '@/cli/ocrService' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import type { OcrRuntimeServiceStatus } from '@/ocr/ocrRuntimeService' +import { OcrRuntimeBusyError } from '@/ocr/ocrRuntimeService' + +const temporaryDirectories: string[] = [] +const spools: ArtifactSpool[] = [] + +const caller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['audio:transcribe', 'ocr:extract', 'artifacts:read'] +} + +const engine = { + coreVersion: '0.5.5', + modelBundleId: 'bundle-v1', + requestedProvider: 'auto' as const, + strategy: 'bounded-960' as const, + detection: { + actualProviderChain: ['coreml', 'cpu'], + precision: 'fp16', + qualificationId: 'private-detection-id' + }, + recognition: { + actualProviderChain: ['cpu'], + precision: 'fp32', + qualificationId: 'private-recognition-id' + } +} + +const readyStatus: OcrRuntimeServiceStatus = { + availability: { + status: 'available', + assets: { + nodeExecutable: '/private/node', + helperEntryPath: '/private/helper.js', + facadeDir: '/private/facade', + runtimeDir: '/private/runtime', + bundlePath: '/private/bundle', + nativePackageDir: '/private/native', + nativePayloadEncoding: 'gzip-base64-v1', + nativePackage: '@arcships/light-ocr-test', + lightOcrVersion: '0.5.5', + bundleId: 'bundle-v1' + } + }, + process: { + state: 'ready', + pid: 123, + nodeVersion: 'v24.0.0', + queuedRequests: 0, + pendingInputBytes: 0, + stderrBytesCaptured: 0, + engine + }, + cache: { + mode: 'persistent', + entryCount: 1, + logicalBytes: 100, + maxBytes: 1024 + } +} + +afterEach(async () => { + await Promise.allSettled(spools.splice(0).map((spool) => spool.close())) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +async function createService( + overrides: { + status?: OcrRuntimeServiceStatus + transcript?: string + } = {} +) { + const root = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-input-')) + temporaryDirectories.push(root) + const artifactSpool = new ArtifactSpool({ directory: path.join(root, 'artifacts') }) + spools.push(artifactSpool) + await artifactSpool.initialize() + + const providerSettings: CliAudioTranscriptionServiceOptions['providerSettings'] = { + getProviderById: vi.fn(() => ({ + id: 'provider-1', + name: 'Provider One', + apiType: 'openai-compatible', + apiKey: 'secret-key', + baseUrl: 'https://private.example', + enable: true + })), + getModelStatus: vi.fn(() => true), + isKnownModel: vi.fn(() => true) + } + const providerRuntime: CliAudioTranscriptionServiceOptions['providerRuntime'] = { + transcribeAudioStandalone: vi.fn(async () => overrides.transcript ?? ' transcript text ') + } + const ocrRuntime: CliOcrServiceOptions['ocrRuntime'] = { + clearCache: vi.fn(async () => undefined), + getStatus: vi.fn(async () => overrides.status ?? readyStatus), + extract: vi.fn(async () => ({ + text: 'recognized image text', + tokenCount: 3, + truncated: false, + mimeType: 'image/png', + imageWidth: 10, + imageHeight: 20, + strategy: 'bounded-960', + engine, + cacheHit: false, + timingMs: { snapshot: 1, preprocessing: 2, recognition: 3, total: 6 } + })), + extractDocument: vi.fn(async () => { + const text = '## Page 1\n\nrecognized PDF text' + return { + text, + tokenCount: 7, + pageSpans: [{ pageNumber: 1, start: 0, end: text.length, complete: true }], + artifactTermination: 'request_complete', + generationOutputLimitReached: false, + generationTokenLimit: 16_000, + emittedPages: 1, + sourcePageCountHint: 1, + engine, + cacheHit: true, + timingMs: { snapshot: 1, recognition: 4, total: 5 } + } + }) + } + return { + root, + artifactSpool, + providerRuntime, + ocrRuntime, + audioService: new CliAudioTranscriptionService({ + providerSettings, + providerRuntime, + artifactSpool, + now: () => 100 + }), + ocrService: new CliOcrService({ + appVersion: '1.2.3', + ocrRuntime, + artifactSpool, + now: () => 100 + }) + } +} + +describe('CLI audio transcription and OCR services', () => { + it('transcribes owned audio artifacts without exposing their file path', async () => { + const { root, artifactSpool, providerRuntime, audioService } = await createService() + const artifact = await artifactSpool.write({ + caller, + requestId: 'request-1', + mimeType: 'audio/wav', + suggestedFilename: 'sample.wav', + data: Buffer.from('audio bytes') + }) + + const result = await audioService.dispatchRpc( + audioTranscribeArtifactRoute.name, + { providerId: 'provider-1', modelId: 'model-1', artifactId: artifact.id }, + caller, + new AbortController().signal + ) + + expect(result).toMatchObject({ + providerId: 'provider-1', + modelId: 'model-1', + text: 'transcript text', + mimeType: 'audio/wav', + inputBytes: 11 + }) + expect(providerRuntime.transcribeAudioStandalone).toHaveBeenCalledWith( + 'provider-1', + 'model-1', + Buffer.from('audio bytes').toString('base64'), + 'audio/wav', + 'sample.wav', + { signal: expect.any(AbortSignal) } + ) + expect(JSON.stringify(result)).not.toContain(root) + }) + + it('preserves cancellation before loading a transcription into memory', async () => { + const { root, providerRuntime, audioService } = await createService() + const filePath = path.join(root, 'sample.wav') + await writeFile(filePath, 'audio bytes') + const controller = new AbortController() + controller.abort() + + await expect( + audioService.dispatchUpload( + audioTranscribeUploadRoute.name, + { + providerId: 'provider-1', + modelId: 'model-1', + mimeType: 'audio/wav', + filename: 'sample.wav' + }, + { path: filePath, size: 11 }, + caller, + controller.signal + ) + ).rejects.toMatchObject({ code: 'cancelled' }) + expect(providerRuntime.transcribeAudioStandalone).not.toHaveBeenCalled() + }) + + it('bounds transcription text without splitting a surrogate pair', async () => { + const prefix = 'a'.repeat(AUDIO_TRANSCRIPTION_MAX_TEXT_CHARACTERS - 1) + const { root, audioService } = await createService({ transcript: `${prefix}😀tail` }) + const filePath = path.join(root, 'sample.wav') + await writeFile(filePath, 'audio bytes') + + const result = await audioService.dispatchUpload( + audioTranscribeUploadRoute.name, + { + providerId: 'provider-1', + modelId: 'model-1', + mimeType: 'audio/wav', + filename: 'sample.wav' + }, + { path: filePath, size: 11 }, + caller, + new AbortController().signal + ) + + expect(result).toMatchObject({ truncated: true, text: prefix }) + }) + + it('extracts image text on the background queue and emits public benchmark data', async () => { + const { root, ocrRuntime, ocrService } = await createService() + const filePath = path.join(root, 'image.png') + const bytes = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) + await writeFile(filePath, bytes) + + const result = await ocrService.dispatchUpload( + ocrExtractUploadRoute.name, + { mimeType: 'image/png', backend: 'auto' }, + { path: filePath, size: bytes.length }, + caller, + new AbortController().signal + ) + + expect(result).toMatchObject({ + kind: 'image', + text: 'recognized image text', + benchmark: { + state: 'miss-warm', + runtimeStateBefore: 'ready', + runtimeWasReady: true, + inputBytes: bytes.length, + appVersion: '1.2.3', + protocolVersion: 1, + surfaceVersion: 1 + }, + engine: { + requestedBackend: 'auto', + detection: { providerChain: ['coreml', 'cpu'] } + } + }) + expect(ocrRuntime.extract).toHaveBeenCalledWith( + expect.objectContaining({ + filePath, + backend: 'auto', + priority: 'background', + signal: expect.any(AbortSignal) + }) + ) + expect(JSON.stringify(result)).not.toContain('qualificationId') + expect(JSON.stringify(result)).not.toContain('/private/') + }) + + it('routes PDF input separately and rejects a mismatched declared image type', async () => { + const { root, ocrRuntime, ocrService } = await createService() + const filePath = path.join(root, 'document.pdf') + const bytes = Buffer.from('%PDF-1.7\nbody') + await writeFile(filePath, bytes) + + const result = await ocrService.dispatchUpload( + ocrExtractUploadRoute.name, + { + mimeType: 'application/pdf', + backend: 'cpu', + sourcePageCountHint: 1, + generationTokenLimit: 100 + }, + { path: filePath, size: bytes.length }, + caller, + new AbortController().signal + ) + + expect(result).toMatchObject({ + kind: 'document', + text: '## Page 1\n\nrecognized PDF text', + cacheHit: true, + benchmark: { state: 'hit' } + }) + expect(ocrRuntime.extractDocument).toHaveBeenCalledWith( + expect.objectContaining({ + backend: 'cpu', + sourcePageCountHint: 1, + generationTokenLimit: 100, + priority: 'background' + }) + ) + + const firstDocumentResult = await vi.mocked(ocrRuntime.extractDocument).mock.results[0].value + vi.mocked(ocrRuntime.extractDocument).mockResolvedValueOnce({ + ...firstDocumentResult, + artifactTermination: 'resource_limited', + resourceLimit: { + code: 'resource_limit_exceeded', + message: 'private helper message', + detail: '/private/runtime/model' + } + }) + const limited = await ocrService.dispatchUpload( + ocrExtractUploadRoute.name, + { mimeType: 'application/pdf', backend: 'auto' }, + { path: filePath, size: bytes.length }, + caller, + new AbortController().signal + ) + expect(limited).toMatchObject({ + truncated: true, + resourceLimit: { + code: 'resource_limit_exceeded', + message: 'OCR document processing reached a resource limit' + } + }) + expect(JSON.stringify(limited)).not.toContain('/private/') + expect(JSON.stringify(limited)).not.toContain('detail') + + await expect( + ocrService.dispatchUpload( + ocrExtractUploadRoute.name, + { mimeType: 'image/png', backend: 'auto' }, + { path: filePath, size: bytes.length }, + caller, + new AbortController().signal + ) + ).rejects.toMatchObject({ code: 'invalid_request' }) + expect(ocrRuntime.extract).not.toHaveBeenCalled() + }) + + it('maps active-extraction cache maintenance to a stable conflict', async () => { + const { ocrRuntime, ocrService } = await createService() + vi.mocked(ocrRuntime.clearCache).mockRejectedValueOnce(new OcrRuntimeBusyError()) + + await expect( + ocrService.dispatchRpc('ocr.clearCache', {}, caller, new AbortController().signal) + ).rejects.toMatchObject({ code: 'conflict', httpStatus: 409 }) + }) + + it('distinguishes cold-runtime misses from offline unavailability', async () => { + const coldStatus: OcrRuntimeServiceStatus = { + ...readyStatus, + process: null, + cache: null + } + const cold = await createService({ status: coldStatus }) + const filePath = path.join(cold.root, 'cold.png') + const bytes = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) + await writeFile(filePath, bytes) + + await expect( + cold.ocrService.dispatchUpload( + ocrExtractUploadRoute.name, + { mimeType: 'image/png', backend: 'auto' }, + { path: filePath, size: bytes.length }, + caller, + new AbortController().signal + ) + ).resolves.toMatchObject({ + benchmark: { + state: 'cold-runtime', + runtimeStateBefore: 'not-started', + runtimeWasReady: false + } + }) + + const offlineStatus: OcrRuntimeServiceStatus = { + availability: { + status: 'unavailable', + reason: 'assets_missing', + lightOcrVersion: '0.5.5', + bundleId: 'bundle-v1' + }, + process: null, + cache: null + } + const offline = await createService({ status: offlineStatus }) + await expect( + offline.ocrService.dispatchUpload( + ocrExtractUploadRoute.name, + { mimeType: 'image/png', backend: 'auto' }, + { path: '/not/inspected/while-offline.png', size: 8 }, + caller, + new AbortController().signal + ) + ).rejects.toMatchObject({ + code: 'unavailable', + httpStatus: 503, + options: { details: { reason: 'assets_missing' } } + }) + expect(offline.ocrRuntime.extract).not.toHaveBeenCalled() + }) +}) diff --git a/test/main/cli/launcherService.test.ts b/test/main/cli/launcherService.test.ts new file mode 100644 index 0000000000..1c90c7f693 --- /dev/null +++ b/test/main/cli/launcherService.test.ts @@ -0,0 +1,484 @@ +import { + chmod, + lstat, + mkdir, + mkdtemp, + readFile, + readlink, + rm, + symlink, + writeFile +} from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { CliLauncherService } from '@/cli/launcherService' + +const temporaryDirectories: string[] = [] +const supportsPosixFilesystemSemantics = process.platform !== 'win32' +const posixIt = it.skipIf(!supportsPosixFilesystemSemantics) + +async function createFixture(platform: NodeJS.Platform = 'darwin') { + const root = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-launcher-')) + temporaryDirectories.push(root) + const homeDirectory = path.join(root, 'home') + const userDataDirectory = path.join(root, 'user-data') + const localAppDataDirectory = path.join(root, 'local-app-data') + const cliDirectory = path.join(root, 'cli-v1') + await mkdir(homeDirectory, { recursive: true }) + await mkdir(userDataDirectory, { recursive: true }) + await mkdir(cliDirectory, { recursive: true }) + await writeFile(path.join(cliDirectory, 'deepchat'), '#!/bin/sh\n', { mode: 0o755 }) + await writeFile(path.join(cliDirectory, 'deepchat.cmd'), '@echo off\r\n') + await writeFile(path.join(cliDirectory, 'deepchat.mjs'), 'console.log("deepchat")\n') + const runtimeNode = path.join( + root, + 'runtime', + 'node', + platform === 'win32' ? 'node.exe' : path.join('bin', 'node') + ) + await mkdir(path.dirname(runtimeNode), { recursive: true }) + await writeFile(runtimeNode, 'fixture runtime\n', { mode: 0o755 }) + let currentCliDirectory: string | null = cliDirectory + const service = new CliLauncherService({ + platform, + homeDirectory, + userDataDirectory, + localAppDataDirectory, + environmentPath: + platform === 'win32' + ? `${path.join(localAppDataDirectory, 'Microsoft', 'WindowsApps')};C:\\Windows\\System32` + : '/usr/bin:/bin', + shell: '/bin/zsh', + resolveCliDirectory: () => currentCliDirectory + }) + return { + root, + homeDirectory, + userDataDirectory, + localAppDataDirectory, + cliDirectory, + runtimeNode, + service, + setCliDirectory: (directory: string | null) => { + currentCliDirectory = directory + } + } +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('CliLauncherService', () => { + it('installs and reverses a POSIX launcher without changing existing shell content', async () => { + const fixture = await createFixture() + const profilePath = path.join(fixture.homeDirectory, '.zprofile') + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + await writeFile(profilePath, 'export EDITOR=vim\n') + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'not-installed', + commandPath, + shellConfigPath: null + }) + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ + state: 'installed', + commandPath, + shellConfigPath: profilePath + }) + const commandStats = await lstat(commandPath) + const command = await readFile(commandPath, 'utf8') + expect(commandStats.isFile()).toBe(true) + expect(commandStats.isSymbolicLink()).toBe(false) + if (supportsPosixFilesystemSemantics) expect(commandStats.mode & 0o111).not.toBe(0) + expect(command).toContain(`runtime_node='${fixture.runtimeNode}'`) + expect(command).toContain(`cli_module='${path.join(fixture.cliDirectory, 'deepchat.mjs')}'`) + expect(command).not.toContain('command -v node') + expect(await readFile(profilePath, 'utf8')).toBe( + [ + 'export EDITOR=vim', + '', + '# >>> DeepChat CLI >>>', + 'case ":$PATH:" in', + ' *":$HOME/.local/bin:"*) ;;', + ' *) export PATH="$HOME/.local/bin:$PATH" ;;', + 'esac', + '# <<< DeepChat CLI <<<', + '' + ].join('\n') + ) + const markerStats = await lstat( + path.join(fixture.userDataDirectory, 'local-control', 'launcher.json') + ) + expect(markerStats.isFile()).toBe(true) + if (supportsPosixFilesystemSemantics) expect(markerStats.mode & 0o777).toBe(0o600) + + await expect(fixture.service.removeOwnedLauncher()).resolves.toMatchObject({ + state: 'not-installed' + }) + await expect(lstat(commandPath)).rejects.toMatchObject({ code: 'ENOENT' }) + expect(await readFile(profilePath, 'utf8')).toBe('export EDITOR=vim\n') + await expect( + lstat(path.join(fixture.userDataDirectory, 'local-control', 'launcher.json')) + ).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('does not edit a shell profile when the user command directory is already on PATH', async () => { + const fixture = await createFixture() + const binDirectory = path.join(fixture.homeDirectory, '.local', 'bin') + const service = new CliLauncherService({ + platform: 'linux', + homeDirectory: fixture.homeDirectory, + userDataDirectory: fixture.userDataDirectory, + environmentPath: `/usr/bin:${binDirectory}`, + shell: '/bin/bash', + resolveCliDirectory: () => fixture.cliDirectory + }) + + await expect(service.ensureInstalled()).resolves.toMatchObject({ + state: 'installed', + shellConfigPath: null + }) + await expect(lstat(path.join(fixture.homeDirectory, '.bashrc'))).rejects.toMatchObject({ + code: 'ENOENT' + }) + }) + + it('uses platform defaults when GUI startup has no shell environment', async () => { + const macFixture = await createFixture() + const macService = new CliLauncherService({ + platform: 'darwin', + homeDirectory: macFixture.homeDirectory, + userDataDirectory: macFixture.userDataDirectory, + environmentPath: '/usr/bin:/bin', + resolveCliDirectory: () => macFixture.cliDirectory + }) + await expect(macService.ensureInstalled()).resolves.toMatchObject({ + shellConfigPath: path.join(macFixture.homeDirectory, '.zprofile') + }) + + const linuxFixture = await createFixture('linux') + const linuxService = new CliLauncherService({ + platform: 'linux', + homeDirectory: linuxFixture.homeDirectory, + userDataDirectory: linuxFixture.userDataDirectory, + environmentPath: '/usr/bin:/bin', + resolveCliDirectory: () => linuxFixture.cliDirectory + }) + await expect(linuxService.ensureInstalled()).resolves.toMatchObject({ + shellConfigPath: path.join(linuxFixture.homeDirectory, '.bashrc') + }) + }) + + it('restores a profile byte-for-byte and removes a profile it created', async () => { + const fixture = await createFixture() + const profilePath = path.join(fixture.homeDirectory, '.zprofile') + await writeFile(profilePath, 'export EDITOR=vim') + + await fixture.service.ensureInstalled() + await fixture.service.removeOwnedLauncher() + expect(await readFile(profilePath, 'utf8')).toBe('export EDITOR=vim') + + await rm(profilePath) + await fixture.service.ensureInstalled() + expect((await lstat(profilePath)).isFile()).toBe(true) + await fixture.service.removeOwnedLauncher() + await expect(lstat(profilePath)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('preserves user shell changes across repeated startup reconciliation', async () => { + const fixture = await createFixture() + const profilePath = path.join(fixture.homeDirectory, '.zprofile') + await writeFile(profilePath, 'export BEFORE=1\n') + await fixture.service.ensureInstalled() + const changedContent = `${await readFile(profilePath, 'utf8')}export AFTER=1\n` + await writeFile(profilePath, changedContent) + + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ + state: 'installed' + }) + + expect(await readFile(profilePath, 'utf8')).toBe(changedContent) + }) + + it('refuses to overwrite an unowned command or an orphaned managed block', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + await mkdir(path.dirname(commandPath), { recursive: true }) + await writeFile(commandPath, 'foreign') + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'conflict', + reason: 'unowned-command' + }) + await expect(fixture.service.ensureInstalled()).rejects.toThrow('without an ownership marker') + expect(await readFile(commandPath, 'utf8')).toBe('foreign') + + await rm(commandPath) + await writeFile( + path.join(fixture.homeDirectory, '.zprofile'), + '# >>> DeepChat CLI >>>\ncustom\n# <<< DeepChat CLI <<<\n' + ) + await expect(fixture.service.ensureInstalled()).rejects.toThrow('without an ownership marker') + }) + + posixIt('fails closed when an owned command or shell block is modified', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + const profilePath = path.join(fixture.homeDirectory, '.zprofile') + await fixture.service.ensureInstalled() + const installedCommand = await readFile(commandPath, 'utf8') + await rm(commandPath) + await symlink('/tmp/not-deepchat', commandPath) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'conflict', + reason: 'command-modified' + }) + await expect(fixture.service.removeOwnedLauncher()).rejects.toThrow('unowned') + expect(await readlink(commandPath)).toBe('/tmp/not-deepchat') + + await rm(commandPath) + await writeFile(commandPath, installedCommand, { mode: 0o755 }) + await writeFile( + profilePath, + (await readFile(profilePath, 'utf8')) + .replace('fish_add_path', 'changed') + .replace('export PATH=', 'export CHANGED=') + ) + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'conflict', + reason: 'shell-config-modified' + }) + await expect(fixture.service.removeOwnedLauncher()).rejects.toThrow('modified') + }) + + it('repairs missing owned files while ensuring launcher availability', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + await fixture.service.ensureInstalled() + await rm(commandPath) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'needs-repair', + reason: 'command-missing' + }) + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ state: 'installed' }) + const repairedCommand = await lstat(commandPath) + expect(repairedCommand.isFile()).toBe(true) + expect(repairedCommand.isSymbolicLink()).toBe(false) + if (supportsPosixFilesystemSemantics) expect(repairedCommand.mode & 0o111).not.toBe(0) + }) + + it('refreshes only a stale launcher whose previous content is still owned', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + await fixture.service.ensureInstalled() + const nextCliDirectory = path.join(fixture.root, 'cli-v2') + await mkdir(nextCliDirectory) + await writeFile(path.join(nextCliDirectory, 'deepchat'), '#!/bin/sh\n', { mode: 0o755 }) + await writeFile(path.join(nextCliDirectory, 'deepchat.mjs'), 'console.log("v2")\n') + fixture.setCliDirectory(nextCliDirectory) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'stale', + reason: 'upgrade-required' + }) + await fixture.service.ensureInstalled() + const refreshedCommand = await readFile(commandPath, 'utf8') + expect(refreshedCommand).toContain( + `cli_module='${path.join(nextCliDirectory, 'deepchat.mjs')}'` + ) + expect(refreshedCommand).not.toContain(fixture.cliDirectory) + await expect(fixture.service.getStatus()).resolves.toMatchObject({ state: 'installed' }) + }) + + posixIt('migrates an owned legacy POSIX symlink to the stable command shim', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + const markerPath = path.join(fixture.userDataDirectory, 'local-control', 'launcher.json') + await fixture.service.ensureInstalled() + + const marker = JSON.parse(await readFile(markerPath, 'utf8')) as Record + delete marker.commandHash + await writeFile(markerPath, `${JSON.stringify(marker)}\n`) + await rm(commandPath) + await symlink(path.join(fixture.cliDirectory, 'deepchat'), commandPath) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'stale', + reason: 'upgrade-required' + }) + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ state: 'installed' }) + + const migratedStats = await lstat(commandPath) + const migratedMarker = JSON.parse(await readFile(markerPath, 'utf8')) as Record + expect(migratedStats.isFile()).toBe(true) + expect(migratedStats.isSymbolicLink()).toBe(false) + expect(migratedMarker.commandHash).toMatch(/^[0-9a-f]{64}$/) + }) + + posixIt('fails closed when an owned POSIX shim loses its executable mode', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + await fixture.service.ensureInstalled() + await chmod(commandPath, 0o644) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'conflict', + reason: 'command-modified' + }) + await expect(fixture.service.ensureInstalled()).rejects.toThrow('unowned') + }) + + it('reports an oversized shell profile without classifying it as modified', async () => { + const fixture = await createFixture() + const profilePath = path.join(fixture.homeDirectory, '.zprofile') + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + const originalProfile = Buffer.alloc(1024 * 1024 + 1, 0x61) + await writeFile(profilePath, originalProfile) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'unavailable', + reason: 'shell-config-too-large', + shellConfigPath: profilePath + }) + await expect(fixture.service.ensureInstalled()).rejects.toThrow('exceeds the supported size') + await expect(lstat(commandPath)).rejects.toMatchObject({ code: 'ENOENT' }) + expect(await readFile(profilePath)).toEqual(originalProfile) + }) + + it('ignores an oversized profile that is unrelated to the selected shell', async () => { + const fixture = await createFixture() + const unrelatedProfilePath = path.join(fixture.homeDirectory, '.bash_profile') + await writeFile(unrelatedProfilePath, Buffer.alloc(1024 * 1024 + 1, 0x61)) + + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ state: 'installed' }) + expect((await lstat(unrelatedProfilePath)).size).toBe(1024 * 1024 + 1) + }) + + it('uses an owned Windows command shim and refreshes it across app paths', async () => { + const fixture = await createFixture('win32') + const commandPath = path.join( + fixture.localAppDataDirectory, + 'Microsoft', + 'WindowsApps', + 'deepchat.cmd' + ) + + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ + state: 'installed', + commandPath, + shellConfigPath: null + }) + expect(await readFile(commandPath, 'utf8')).toContain( + `set "cli_module=${path.join(fixture.cliDirectory, 'deepchat.mjs')}"` + ) + expect(await readFile(commandPath, 'utf8')).toContain( + `set "runtime_node=${fixture.runtimeNode}"` + ) + expect(await readFile(commandPath, 'utf8')).not.toContain('where node') + + const nextCliDirectory = path.join(fixture.root, 'cli-win-v2') + await mkdir(nextCliDirectory) + await writeFile(path.join(nextCliDirectory, 'deepchat.mjs'), 'console.log("v2")\n') + fixture.setCliDirectory(nextCliDirectory) + await expect(fixture.service.getStatus()).resolves.toMatchObject({ state: 'stale' }) + await fixture.service.ensureInstalled() + expect(await readFile(commandPath, 'utf8')).toContain( + `set "cli_module=${path.join(nextCliDirectory, 'deepchat.mjs')}"` + ) + + await expect(fixture.service.removeOwnedLauncher()).resolves.toMatchObject({ + state: 'not-installed' + }) + await expect(lstat(commandPath)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('matches an owned Windows marker path without case sensitivity', async () => { + const fixture = await createFixture('win32') + const markerPath = path.join(fixture.userDataDirectory, 'local-control', 'launcher.json') + const commandPath = path.join( + fixture.localAppDataDirectory, + 'Microsoft', + 'WindowsApps', + 'deepchat.cmd' + ) + await fixture.service.ensureInstalled() + const marker = JSON.parse(await readFile(markerPath, 'utf8')) as Record + marker.commandPath = String(marker.commandPath).toUpperCase() + await writeFile(markerPath, `${JSON.stringify(marker)}\n`) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ state: 'installed' }) + await expect(fixture.service.ensureInstalled()).resolves.toMatchObject({ state: 'installed' }) + await expect(fixture.service.removeOwnedLauncher()).resolves.toMatchObject({ + state: 'not-installed' + }) + await expect(lstat(commandPath)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('does not claim Windows installation when its user command directory is off PATH', async () => { + const fixture = await createFixture('win32') + const service = new CliLauncherService({ + platform: 'win32', + homeDirectory: fixture.homeDirectory, + userDataDirectory: fixture.userDataDirectory, + localAppDataDirectory: fixture.localAppDataDirectory, + environmentPath: 'C:\\Windows\\System32', + resolveCliDirectory: () => fixture.cliDirectory + }) + + await expect(service.getStatus()).resolves.toMatchObject({ + state: 'unavailable', + reason: 'path-unavailable' + }) + await expect(service.ensureInstalled()).rejects.toThrow('not available on PATH') + }) + + it('reports an unavailable source without creating installation state', async () => { + const fixture = await createFixture() + fixture.setCliDirectory(null) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'unavailable', + reason: 'source-missing' + }) + await expect(fixture.service.ensureInstalled()).rejects.toThrow('unavailable') + }) + + it('can remove owned integration after the packaged source disappears', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + const profilePath = path.join(fixture.homeDirectory, '.zprofile') + await fixture.service.ensureInstalled() + fixture.setCliDirectory(null) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'unavailable', + reason: 'source-missing' + }) + + await expect(fixture.service.removeOwnedLauncher()).resolves.toMatchObject({ + state: 'unavailable', + reason: 'source-missing' + }) + await expect(lstat(commandPath)).rejects.toMatchObject({ code: 'ENOENT' }) + await expect(lstat(profilePath)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('prioritizes a missing packaged source over missing owned files', async () => { + const fixture = await createFixture() + const commandPath = path.join(fixture.homeDirectory, '.local', 'bin', 'deepchat') + await fixture.service.ensureInstalled() + await rm(commandPath) + fixture.setCliDirectory(null) + + await expect(fixture.service.getStatus()).resolves.toMatchObject({ + state: 'unavailable', + reason: 'source-missing' + }) + }) +}) diff --git a/test/main/cli/mcpAdminRoutes.test.ts b/test/main/cli/mcpAdminRoutes.test.ts new file mode 100644 index 0000000000..dbf999401e --- /dev/null +++ b/test/main/cli/mcpAdminRoutes.test.ts @@ -0,0 +1,517 @@ +import { describe, expect, it, vi } from 'vitest' +import { + mcpAddPublicRoute, + mcpListPublicRoute, + mcpRemovePublicRoute, + mcpSetPublicStatusRoute, + mcpStartPublicRoute, + mcpStopPublicRoute, + mcpUpdatePublicRoute +} from '@shared/contracts/routes' +import type { MCPServerConfig, McpServicePort } from '@shared/types/mcp' +import { createCliMcpAdminRoutes } from '@/cli/mcpAdminRoutes' +import type { CliRouteCaller, RouteContext } from '@/routes/routeRegistry' + +const caller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['mcp:read', 'mcp:write'] +} + +function stdioConfig(overrides: Partial = {}): MCPServerConfig { + return { + type: 'stdio', + command: '/private/bin/npx', + args: ['--yes', 'private-package'], + env: { PRIVATE_TOKEN: 'super-secret' }, + descriptions: 'Server\n\u001b[31m description', + icons: 'terminal', + enabled: false, + inheritEnv: 'minimal', + ...overrides + } +} + +function createHarness(initialServers: Record = {}) { + const servers = new Map(Object.entries(initialServers)) + const running = new Map() + const getMcpServers = vi.fn(async () => Object.fromEntries(servers)) + const isServerRunning = vi.fn(async (serverName: string) => running.get(serverName) ?? false) + const addMcpServer = vi.fn(async (serverName: string, config: MCPServerConfig) => { + if (servers.has(serverName)) return { status: 'duplicate' as const } + servers.set(serverName, config) + return { status: 'added' as const } + }) + const updateMcpServer = vi.fn(async (serverName: string, updates: Partial) => { + const current = servers.get(serverName) + if (!current) throw new Error('missing') + servers.set(serverName, { ...current, ...updates }) + }) + const setMcpServerEnabled = vi.fn(async (serverName: string, enabled: boolean) => { + const current = servers.get(serverName) + if (!current) throw new Error('missing') + servers.set(serverName, { ...current, enabled }) + running.set(serverName, enabled) + }) + const startServer = vi.fn(async (serverName: string) => { + running.set(serverName, true) + }) + const stopServer = vi.fn(async (serverName: string) => { + running.set(serverName, false) + }) + const removeMcpServer = vi.fn(async (serverName: string) => { + servers.delete(serverName) + running.delete(serverName) + }) + const recordSettingsActivity = vi.fn() + const log = { warn: vi.fn() } + const routes = createCliMcpAdminRoutes({ + mcp: { + getMcpServers, + isServerRunning, + addMcpServer, + updateMcpServer, + setMcpServerEnabled, + startServer, + stopServer, + removeMcpServer + } as Pick< + McpServicePort, + | 'getMcpServers' + | 'isServerRunning' + | 'addMcpServer' + | 'updateMcpServer' + | 'setMcpServerEnabled' + | 'startServer' + | 'stopServer' + | 'removeMcpServer' + >, + recordSettingsActivity, + log + }) + const invoke = async (method: string, input: unknown, context: RouteContext = { caller }) => { + const route = routes.get(method as never) + if (!route) throw new Error(`Missing route: ${method}`) + return await route(input, context) + } + + return { + servers, + running, + getMcpServers, + isServerRunning, + addMcpServer, + updateMcpServer, + setMcpServerEnabled, + startServer, + stopServer, + removeMcpServer, + recordSettingsActivity, + log, + invoke + } +} + +describe('CLI MCP administration routes', () => { + it('accepts only bounded public transports and structurally complete authorization', () => { + expect( + mcpAddPublicRoute.input.safeParse({ + serverName: 'local-server', + config: { type: 'stdio', command: 'npx' } + }).success + ).toBe(true) + for (const serverName of ['__proto__', 'constructor', 'toString', 'prototype']) { + expect( + mcpAddPublicRoute.input.safeParse({ + serverName, + config: { type: 'stdio', command: 'npx' } + }).success + ).toBe(false) + } + expect( + mcpAddPublicRoute.input.safeParse({ + serverName: 'internal', + config: { type: 'inmemory', command: '' } + }).success + ).toBe(false) + expect( + mcpUpdatePublicRoute.input.safeParse({ + serverName: 'server', + updates: { command: 'npx', baseUrl: 'https://mcp.example/api' } + }).success + ).toBe(false) + expect( + mcpAddPublicRoute.input.safeParse({ + serverName: 'host-owned', + config: { type: 'stdio', command: 'npx', ownerPluginId: 'plugin-private' } + }).success + ).toBe(false) + for (const config of [ + { type: 'http', baseUrl: 'not-a-url' }, + { type: 'http', baseUrl: 'http://mcp.example/api' }, + { type: 'http', baseUrl: 'https://user:secret@mcp.example/api' }, + { type: 'http', baseUrl: 'https://mcp.example/api?token=secret' }, + { + type: 'sse', + baseUrl: 'https://mcp.example/sse', + authorization: { mode: 'interactive' } + }, + { + type: 'http', + baseUrl: 'https://mcp.example/api', + headers: { Authorization: 'Bearer secret\r\nX-Injected: true' } + }, + { + type: 'http', + baseUrl: 'https://mcp.example/api', + authorization: { mode: 'client_credentials', clientId: 'client-1' } + }, + { + type: 'http', + baseUrl: 'https://mcp.example/api', + headers: { Authorization: 'first', authorization: 'second' } + } + ]) { + expect( + mcpAddPublicRoute.input.safeParse({ serverName: 'unsafe-server', config }).success + ).toBe(false) + } + expect( + mcpAddPublicRoute.input.safeParse({ + serverName: 'machine-server', + config: { + type: 'http', + baseUrl: 'https://mcp.example/api', + authorization: { + mode: 'private_key_jwt', + clientId: 'client-1', + protectedResourceUrl: 'https://mcp.example/', + authorizationServerIssuer: 'https://identity.example/', + keyAlgorithm: 'ES256' + } + } + }).success + ).toBe(true) + expect( + mcpAddPublicRoute.input.safeParse({ + serverName: 'oversized-server', + config: { + type: 'stdio', + command: 'npx', + environment: Object.fromEntries( + Array.from({ length: 13 }, (_, index) => [`VALUE_${index}`, 'x'.repeat(64 * 1024)]) + ) + } + }).success + ).toBe(false) + }) + + it('lists deterministic redacted summaries without paths, arguments, headers, or secrets', async () => { + const harness = createHarness({ + user: stdioConfig(), + plugin: stdioConfig({ ownerPluginId: 'private-plugin', source: 'plugin' }), + builtin: stdioConfig({ type: 'inmemory', command: '', args: [], env: {} }), + remote: { + ...stdioConfig(), + type: 'http', + command: '', + args: [], + env: {}, + baseUrl: 'https://mcp.example/private/path', + customHeaders: { Authorization: 'Bearer super-secret' }, + authorization: { + mode: 'client_credentials', + clientId: 'private-client-id', + protectedResourceUrl: 'https://mcp.example/', + authorizationServerIssuer: 'https://identity.example/' + } + } + }) + harness.running.set('user', true) + harness.isServerRunning.mockRejectedValueOnce(new Error('runtime secret')) + + const result = (await harness.invoke(mcpListPublicRoute.name, {})) as { + servers: Array> + truncated: boolean + } + + expect(result.servers.map((server) => server.name)).toEqual([ + 'builtin', + 'plugin', + 'remote', + 'user' + ]) + expect(result.servers.find((server) => server.name === 'builtin')).toMatchObject({ + managedBy: 'deepchat', + editable: false, + removable: false, + running: null + }) + expect(result.servers.find((server) => server.name === 'plugin')).toMatchObject({ + managedBy: 'plugin', + editable: false, + removable: false + }) + expect(result.servers.find((server) => server.name === 'user')).toMatchObject({ + commandName: 'npx', + argumentCount: 2, + environmentEntryCount: 1 + }) + expect(result.servers.find((server) => server.name === 'remote')).toMatchObject({ + endpoint: { origin: 'https://mcp.example', pathPresent: true }, + headerEntryCount: 1, + authorizationMode: 'client_credentials' + }) + const serialized = JSON.stringify(result) + for (const secret of [ + '/private/bin', + 'private-package', + 'super-secret', + 'private-plugin', + 'private-client-id', + '/private/path' + ]) { + expect(serialized).not.toContain(secret) + } + }) + + it('adds disabled servers, defaults to minimal environment, and rejects duplicate names', async () => { + const harness = createHarness() + + await expect( + harness.invoke(mcpAddPublicRoute.name, { + serverName: 'new-server', + config: { type: 'stdio', command: 'npx', args: ['server-package'] } + }) + ).resolves.toMatchObject({ + server: { + name: 'new-server', + type: 'stdio', + enabled: false, + commandName: 'npx' + } + }) + expect(harness.servers.get('new-server')).toMatchObject({ + enabled: false, + inheritEnv: 'minimal', + env: {}, + args: ['server-package'] + }) + await expect( + harness.invoke(mcpAddPublicRoute.name, { + serverName: 'new-server', + config: { type: 'stdio', command: 'other-command' } + }) + ).rejects.toMatchObject({ code: 'conflict' }) + expect(harness.recordSettingsActivity).toHaveBeenCalledOnce() + }) + + it('returns canonical MCP state read back after successful mutations', async () => { + const harness = createHarness({ server: stdioConfig() }) + harness.addMcpServer.mockImplementationOnce(async (serverName, config) => { + harness.servers.set(serverName, { + ...config, + command: '/managed/bin/pnpm', + enabled: true + }) + return { status: 'added' as const } + }) + + await expect( + harness.invoke(mcpAddPublicRoute.name, { + serverName: 'normalized', + config: { type: 'stdio', command: 'npx' } + }) + ).resolves.toMatchObject({ + server: { name: 'normalized', commandName: 'pnpm', enabled: true } + }) + + harness.updateMcpServer.mockImplementationOnce(async (serverName, updates) => { + harness.servers.set(serverName, { + ...harness.servers.get(serverName)!, + ...updates, + descriptions: 'Persisted description' + }) + }) + await expect( + harness.invoke(mcpUpdatePublicRoute.name, { + serverName: 'server', + updates: { description: 'Requested description' } + }) + ).resolves.toMatchObject({ server: { description: 'Persisted description' } }) + + harness.setMcpServerEnabled.mockImplementationOnce(async (serverName) => { + harness.servers.set(serverName, { ...harness.servers.get(serverName)!, enabled: false }) + }) + await expect( + harness.invoke(mcpSetPublicStatusRoute.name, { serverName: 'server', enabled: true }) + ).resolves.toMatchObject({ server: { enabled: false } }) + }) + + it('marks a successful mutation as applied when canonical read-back fails', async () => { + const harness = createHarness() + harness.getMcpServers.mockRejectedValueOnce(new Error('store unavailable')) + + const failure = await harness + .invoke(mcpAddPublicRoute.name, { + serverName: 'applied-server', + config: { type: 'stdio', command: 'npx' } + }) + .catch((error: unknown) => error) + + expect(harness.servers.has('applied-server')).toBe(true) + expect(failure).toMatchObject({ + code: 'unavailable', + retriable: false, + options: { details: { serverName: 'applied-server', applied: true } } + }) + expect(harness.recordSettingsActivity).toHaveBeenCalledOnce() + }) + + it('preserves unmentioned secrets and clears incompatible fields on transport changes', async () => { + const harness = createHarness({ + server: stdioConfig({ customNpmRegistry: 'https://registry.example/npm' }) + }) + + await harness.invoke(mcpUpdatePublicRoute.name, { + serverName: 'server', + updates: { description: 'Updated description' } + }) + expect(harness.servers.get('server')).toMatchObject({ + env: { PRIVATE_TOKEN: 'super-secret' }, + args: ['--yes', 'private-package'], + customNpmRegistry: 'https://registry.example/npm' + }) + + await harness.invoke(mcpUpdatePublicRoute.name, { + serverName: 'server', + updates: { + type: 'http', + baseUrl: 'https://mcp.example/api', + headers: { Authorization: 'Bearer replacement' } + } + }) + expect(harness.servers.get('server')).toMatchObject({ + type: 'http', + command: '', + args: [], + env: {}, + baseUrl: 'https://mcp.example/api', + customHeaders: { Authorization: 'Bearer replacement' } + }) + expect(harness.servers.get('server')?.customNpmRegistry).toBeUndefined() + expect(harness.servers.get('server')?.inheritEnv).toBeUndefined() + + await expect( + harness.invoke(mcpUpdatePublicRoute.name, { + serverName: 'server', + updates: { command: 'npx' } + }) + ).rejects.toMatchObject({ code: 'invalid_request' }) + }) + + it('allows policy-gated Agent adapters but keeps runtime and destructive mutations human-only', async () => { + const harness = createHarness({ + plugin: stdioConfig({ ownerPluginId: 'plugin-1' }), + builtin: stdioConfig({ type: 'inmemory', command: '', args: [], env: {} }) + }) + + for (const [method, input] of [ + [mcpUpdatePublicRoute.name, { serverName: 'plugin', updates: { description: 'x' } }], + [mcpRemovePublicRoute.name, { serverName: 'builtin' }], + [mcpStartPublicRoute.name, { serverName: 'plugin' }], + [mcpStopPublicRoute.name, { serverName: 'builtin' }] + ] as const) { + await expect(harness.invoke(method, input)).rejects.toMatchObject({ code: 'conflict' }) + } + await expect( + harness.invoke( + mcpListPublicRoute.name, + {}, + { caller: { kind: 'renderer', webContentsId: 1, windowId: 1 } } + ) + ).rejects.toMatchObject({ code: 'permission_denied' }) + const agentCaller: CliRouteCaller = { + ...caller, + principal: 'agent', + tokenId: 'token-id-conversation-1', + conversationId: 'conversation-1', + expiresAt: Date.now() + 60_000 + } + await expect( + harness.invoke(mcpListPublicRoute.name, {}, { caller: agentCaller }) + ).resolves.toMatchObject({ truncated: false }) + await expect( + harness.invoke( + mcpAddPublicRoute.name, + { + serverName: 'agent-server', + config: { type: 'http', baseUrl: 'https://mcp.example/agent' } + }, + { caller: agentCaller } + ) + ).resolves.toMatchObject({ server: { name: 'agent-server', enabled: false } }) + await expect( + harness.invoke( + mcpUpdatePublicRoute.name, + { serverName: 'agent-server', updates: { command: 'pnpm' } }, + { caller: agentCaller } + ) + ).rejects.toMatchObject({ code: 'permission_denied' }) + await expect( + harness.invoke(mcpRemovePublicRoute.name, { serverName: 'plugin' }, { caller: agentCaller }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + expect(harness.removeMcpServer).not.toHaveBeenCalled() + }) + + it('controls user-owned runtime state and removal through public adapters', async () => { + const harness = createHarness({ server: stdioConfig() }) + + await expect( + harness.invoke(mcpSetPublicStatusRoute.name, { serverName: 'server', enabled: true }) + ).resolves.toMatchObject({ + server: { name: 'server', enabled: true, running: true } + }) + await expect( + harness.invoke(mcpStopPublicRoute.name, { serverName: 'server' }) + ).resolves.toMatchObject({ server: { enabled: true, running: false } }) + await expect( + harness.invoke(mcpStartPublicRoute.name, { serverName: 'server' }) + ).resolves.toMatchObject({ server: { enabled: true, running: true } }) + await expect( + harness.invoke(mcpRemovePublicRoute.name, { serverName: 'server' }) + ).resolves.toEqual({ serverName: 'server', removed: true }) + + expect(harness.setMcpServerEnabled).toHaveBeenCalledWith('server', true) + expect(harness.stopServer).toHaveBeenCalledWith('server') + expect(harness.startServer).toHaveBeenCalledWith('server') + expect(harness.removeMcpServer).toHaveBeenCalledWith('server') + expect(harness.recordSettingsActivity).toHaveBeenCalledTimes(4) + }) + + it('reports persisted state when enablement only partially succeeds', async () => { + const harness = createHarness({ server: stdioConfig() }) + harness.setMcpServerEnabled.mockImplementationOnce(async (serverName, enabled) => { + harness.servers.set(serverName, { ...harness.servers.get(serverName)!, enabled }) + throw new Error('start failed with PRIVATE_TOKEN=super-secret') + }) + + const failure = await harness + .invoke(mcpSetPublicStatusRoute.name, { serverName: 'server', enabled: true }) + .catch((error: unknown) => error) + + expect(failure).toMatchObject({ + code: 'unavailable', + options: { + details: { serverName: 'server', enabled: true, running: false } + } + }) + expect(String((failure as Error).message)).not.toContain('PRIVATE_TOKEN') + expect(harness.log.warn).toHaveBeenCalledWith( + '[CLI] MCP enablement changed incompletely', + expect.not.objectContaining({ error: expect.stringContaining('super-secret') }) + ) + expect(harness.recordSettingsActivity).toHaveBeenCalledOnce() + }) +}) diff --git a/test/main/cli/mediaOutput.test.ts b/test/main/cli/mediaOutput.test.ts new file mode 100644 index 0000000000..6ef658a5f2 --- /dev/null +++ b/test/main/cli/mediaOutput.test.ts @@ -0,0 +1,106 @@ +import { mkdtemp, rm, symlink, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { resolveGeneratedMedia } from '@/cli/mediaOutput' + +const temporaryDirectories: string[] = [] + +async function createCacheDirectory(): Promise { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-media-')) + temporaryDirectories.push(directory) + return directory +} + +async function collect(data: AsyncIterable): Promise { + const chunks: Buffer[] = [] + for await (const chunk of data) chunks.push(Buffer.from(chunk)) + return Buffer.concat(chunks) +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('generated media resolver', () => { + it('strictly decodes raw base64 and matching data URLs', async () => { + const directory = await createCacheDirectory() + const raw = await resolveGeneratedMedia('aGVsbG8=', 'image/png', 'image', directory) + const dataUrl = await resolveGeneratedMedia( + 'data:audio/ogg; codecs=opus;base64,aGVsbG8=', + 'audio/ogg; codecs=opus', + 'audio', + directory + ) + + expect(await collect(raw.data)).toEqual(Buffer.from('hello')) + expect(raw.mimeType).toBe('image/png') + expect(await collect(dataUrl.data)).toEqual(Buffer.from('hello')) + expect(dataUrl.mimeType).toBe('audio/ogg; codecs=opus') + }) + + it('rejects malformed, conflicting, cross-kind, and remote outputs', async () => { + const directory = await createCacheDirectory() + + await expect( + resolveGeneratedMedia('not base64', 'image/png', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + await expect( + resolveGeneratedMedia('data:image/jpeg;base64,aGVsbG8=', 'image/png', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + await expect( + resolveGeneratedMedia('aGVsbG8=', 'video/mp4', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + await expect( + resolveGeneratedMedia('https://private.example/output.png', 'image/png', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + + const invalidAlphabet = await resolveGeneratedMedia('abcd!===', 'image/png', 'image', directory) + await expect(collect(invalidAlphabet.data)).rejects.toMatchObject({ code: 'unavailable' }) + }) + + it('streams only regular files contained by the image cache', async () => { + const directory = await createCacheDirectory() + await writeFile(path.join(directory, 'generated.png'), 'cached-image') + const resolved = await resolveGeneratedMedia( + 'imgcache://generated.png', + 'image/png', + 'image', + directory + ) + + expect(await collect(resolved.data)).toEqual(Buffer.from('cached-image')) + await resolved.dispose?.() + await resolved.dispose?.() + + await expect( + resolveGeneratedMedia('imgcache://%2e%2e%2foutside.png', 'image/png', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + await expect( + resolveGeneratedMedia('imgcache://CON.png', 'image/png', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + await expect( + resolveGeneratedMedia('imgcache://generated.png', 'image/png', 'video', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + }) + + it.skipIf(process.platform === 'win32')('rejects symbolic links in the image cache', async () => { + const root = await createCacheDirectory() + const directory = path.join(root, 'images') + await writeFile(path.join(root, 'target.png'), 'cached-image') + await symlink(root, directory) + + await expect( + resolveGeneratedMedia('imgcache://target.png', 'image/png', 'image', directory) + ).rejects.toMatchObject({ code: 'unavailable' }) + + await rm(directory) + await writeFile(path.join(root, 'linked-target.png'), 'cached-image') + await symlink(path.join(root, 'linked-target.png'), path.join(root, 'linked.png')) + await expect( + resolveGeneratedMedia('imgcache://linked.png', 'image/png', 'image', root) + ).rejects.toMatchObject({ code: 'unavailable' }) + }) +}) diff --git a/test/main/cli/mutationGuard.test.ts b/test/main/cli/mutationGuard.test.ts new file mode 100644 index 0000000000..64749335b2 --- /dev/null +++ b/test/main/cli/mutationGuard.test.ts @@ -0,0 +1,243 @@ +import { describe, expect, it, vi } from 'vitest' +import { ApprovalBroker } from '@/approval' +import { CliMutationGuard, type CliApprovalPresentationPort } from '@/cli/mutationGuard' +import { CliRequestError } from '@/cli/errors' + +const rendererCaller = (webContentsId: number) => ({ + kind: 'renderer' as const, + webContentsId, + windowId: 7 +}) + +function createHarness(maxPendingPerScope?: number) { + const requests: Array[1]> = [] + const close = vi.fn(async () => undefined) + const presentation: CliApprovalPresentationPort = { + getTarget: vi.fn(async () => ({ windowId: 7, webContentsId: 70 })), + present: vi.fn(async (_target, payload) => { + requests.push(payload) + return true + }), + close + } + const approvals = new ApprovalBroker( + maxPendingPerScope === undefined ? undefined : { maxPendingPerScope } + ) + const guard = new CliMutationGuard(approvals, presentation) + const authorize = (signal = new AbortController().signal) => + guard.authorize({ + operation: 'skills.installFromUrl', + effect: 'supply-chain', + principal: 'human', + connectionId: 'connection-1', + clientRequestId: 'client-1', + arguments: { url: 'https://example.com/skill.git' }, + displayData: { host: 'example.com' }, + signal + }) + + return { approvals, authorize, close, guard, presentation, requests } +} + +async function waitForRequests(requests: unknown[], count: number): Promise { + for (let attempt = 0; attempt < 20 && requests.length < count; attempt += 1) { + await Promise.resolve() + } + expect(requests).toHaveLength(count) +} + +describe('CliMutationGuard', () => { + it('resumes only the exact request resolved by its target renderer', async () => { + const harness = createHarness() + const pending = harness.authorize() + await waitForRequests(harness.requests, 1) + const requestId = harness.requests[0].requestId + expect(JSON.stringify(harness.requests[0])).not.toContain('https://example.com/skill.git') + + expect(harness.guard.resolve({ requestId, decision: 'approved' }, rendererCaller(71))).toBe( + false + ) + expect(harness.guard.resolve({ requestId, decision: 'approved' }, rendererCaller(70))).toBe( + true + ) + await expect(pending).resolves.toEqual({ approvalRequestId: requestId }) + expect(harness.guard.resolve({ requestId, decision: 'approved' }, rendererCaller(70))).toBe( + false + ) + expect(harness.close).toHaveBeenCalledWith( + { windowId: 7, webContentsId: 70 }, + { requestId, reason: 'approved' } + ) + }) + + it('publishes the broker-normalized copy of redacted display data', async () => { + const harness = createHarness() + const displayData = { nested: { label: 'safe' } } + const pending = harness.guard.authorize({ + operation: 'skills.installFromUrl', + effect: 'supply-chain', + principal: 'human', + connectionId: 'connection-1', + clientRequestId: 'client-1', + arguments: { url: 'https://example.com/skill.git' }, + displayData, + signal: new AbortController().signal + }) + await waitForRequests(harness.requests, 1) + displayData.nested.label = 'mutated-after-create' + const requestId = harness.requests[0].requestId + + expect(harness.requests[0].displayData).toEqual({ nested: { label: 'safe' } }) + harness.guard.resolve({ requestId, decision: 'denied' }, rendererCaller(70)) + await expect(pending).rejects.toMatchObject({ code: 'approval_denied' }) + }) + + it('does not deduplicate identical concurrent mutations', async () => { + const harness = createHarness() + const first = harness.authorize() + const second = harness.authorize() + await waitForRequests(harness.requests, 2) + const firstId = harness.requests[0].requestId + const secondId = harness.requests[1].requestId + + expect(firstId).not.toBe(secondId) + expect( + harness.guard.resolve({ requestId: firstId, decision: 'approved' }, rendererCaller(70)) + ).toBe(true) + await expect(first).resolves.toEqual({ approvalRequestId: firstId }) + let secondSettled = false + void second.then( + () => { + secondSettled = true + }, + () => { + secondSettled = true + } + ) + await Promise.resolve() + expect(secondSettled).toBe(false) + + expect( + harness.guard.resolve({ requestId: secondId, decision: 'denied' }, rendererCaller(70)) + ).toBe(true) + await expect(second).rejects.toMatchObject({ code: 'approval_denied' }) + }) + + it('limits pending mutations across one CLI connection', async () => { + const harness = createHarness(1) + const first = harness.authorize() + await waitForRequests(harness.requests, 1) + + await expect(harness.authorize()).rejects.toMatchObject({ + code: 'rate_limited', + httpStatus: 429 + }) + expect(harness.requests).toHaveLength(1) + + const requestId = harness.requests[0].requestId + harness.guard.resolve({ requestId, decision: 'denied' }, rendererCaller(70)) + await expect(first).rejects.toMatchObject({ code: 'approval_denied' }) + }) + + it('fails closed when no trusted renderer is available', async () => { + const harness = createHarness() + vi.mocked(harness.presentation.getTarget).mockResolvedValueOnce(null) + + await expect(harness.authorize()).rejects.toMatchObject({ + code: 'unavailable', + httpStatus: 503 + }) + expect(harness.presentation.present).not.toHaveBeenCalled() + }) + + it('normalizes a pre-aborted signal to the CLI cancellation contract', async () => { + const harness = createHarness() + const controller = new AbortController() + controller.abort() + + await expect(harness.authorize(controller.signal)).rejects.toMatchObject({ + code: 'cancelled' + }) + expect(harness.presentation.getTarget).not.toHaveBeenCalled() + }) + + it('fails closed when targeted event delivery fails', async () => { + const harness = createHarness() + vi.mocked(harness.presentation.present).mockResolvedValueOnce(false) + + await expect(harness.authorize()).rejects.toMatchObject({ code: 'unavailable' }) + expect(harness.close).toHaveBeenCalledWith( + { windowId: 7, webContentsId: 70 }, + expect.objectContaining({ reason: 'unavailable' }) + ) + }) + + it('expires an unanswered request without leaving a replayable approval', async () => { + vi.useFakeTimers() + try { + const harness = createHarness() + const pending = harness.guard.authorize({ + operation: 'skills.installFromUrl', + effect: 'supply-chain', + principal: 'human', + connectionId: 'connection-1', + clientRequestId: 'client-1', + arguments: { url: 'https://example.com/skill.git' }, + displayData: { host: 'example.com' }, + signal: new AbortController().signal, + timeoutMs: 10 + }) + await waitForRequests(harness.requests, 1) + const rejection = expect(pending).rejects.toMatchObject({ code: 'approval_timeout' }) + await vi.advanceTimersByTimeAsync(10) + + await rejection + expect( + harness.guard.resolve( + { requestId: harness.requests[0].requestId, decision: 'approved' }, + rendererCaller(70) + ) + ).toBe(false) + } finally { + vi.useRealTimers() + } + }) + + it('cancels the pending approval when the HTTP request aborts', async () => { + const harness = createHarness() + const controller = new AbortController() + const pending = harness.authorize(controller.signal) + await waitForRequests(harness.requests, 1) + controller.abort(new CliRequestError('cancelled', 'Request was cancelled')) + + await expect(pending).rejects.toMatchObject({ code: 'cancelled' }) + expect(harness.close).toHaveBeenCalledWith( + { windowId: 7, webContentsId: 70 }, + { requestId: harness.requests[0].requestId, reason: 'cancelled' } + ) + }) + + it('cancels every request owned by a renderer that becomes unavailable', async () => { + const harness = createHarness() + const pending = harness.authorize() + await waitForRequests(harness.requests, 1) + + harness.guard.cancelRenderer(70) + + await expect(pending).rejects.toMatchObject({ code: 'unavailable' }) + }) + + it('reports broker shutdown as cancellation rather than a user denial', async () => { + const harness = createHarness() + const pending = harness.authorize() + await waitForRequests(harness.requests, 1) + + harness.guard.clear() + + await expect(pending).rejects.toMatchObject({ code: 'cancelled', retriable: true }) + expect(harness.close).toHaveBeenCalledWith( + { windowId: 7, webContentsId: 70 }, + { requestId: harness.requests[0].requestId, reason: 'cancelled' } + ) + }) +}) diff --git a/test/main/cli/packagedSmoke.test.ts b/test/main/cli/packagedSmoke.test.ts new file mode 100644 index 0000000000..4df8c75633 --- /dev/null +++ b/test/main/cli/packagedSmoke.test.ts @@ -0,0 +1,268 @@ +import { execFile } from 'node:child_process' +import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { promisify } from 'node:util' +import { + LOCAL_CONTROL_AGENT_TOKEN_ENV, + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SCOPES, + LOCAL_CONTROL_SURFACE_VERSION, + LocalControlRpcResponseSchema, + LocalControlStreamRecordSchema +} from '@shared/contracts/localControl' +import { + artifactsDescribeRoute, + cliVersionRoute, + modelsInvokeRoute, + ocrExtractUploadRoute +} from '@shared/contracts/routes' +import { ArtifactSpool } from '@/cli/artifactSpool' +import { CliServer, type CliServerDependencies } from '@/cli/server' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import { buildCli } from '../../../scripts/build-cli.mjs' + +const execFileAsync = promisify(execFile) +const CLI_PROCESS_TIMEOUT_MS = 5_000 +const PACKAGED_SMOKE_TIMEOUT_MS = 30_000 + +function cliEnvironment( + userDataPath: string, + overrides: NodeJS.ProcessEnv = {} +): NodeJS.ProcessEnv { + const environment = { + ...process.env, + DEEPCHAT_E2E_USER_DATA_DIR: userDataPath, + ...overrides + } + if (!Object.prototype.hasOwnProperty.call(overrides, LOCAL_CONTROL_AGENT_TOKEN_ENV)) { + delete environment[LOCAL_CONTROL_AGENT_TOKEN_ENV] + } + return environment +} + +describe('packaged CLI smoke', () => { + async function runPackagedCliSmoke(): Promise { + const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-smoke-')) + const outputDirectory = path.join(temporaryDirectory, 'cli') + const entryPath = path.join(outputDirectory, 'deepchat.mjs') + const userDataPath = path.join(temporaryDirectory, 'profile') + const spool = new ArtifactSpool({ + directory: path.join(temporaryDirectory, 'artifacts'), + cleanupIntervalMs: 60_000 + }) + let server: CliServer | undefined + + try { + await buildCli({ outDir: outputDirectory, logLevel: 'silent' }) + const seedCaller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'smoke-seed', + scopes: LOCAL_CONTROL_SCOPES + } + const artifactBytes = Buffer.from('packaged artifact smoke\n') + const artifact = await spool.write({ + caller: seedCaller, + requestId: 'packaged-smoke-artifact', + mimeType: 'text/plain', + suggestedFilename: 'smoke.txt', + data: artifactBytes + }) + const ocrInput = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) + const ocrInputPath = path.join(temporaryDirectory, 'smoke.png') + const artifactOutputPath = path.join(temporaryDirectory, 'artifact-output.txt') + await writeFile(ocrInputPath, ocrInput) + + let resolveShutdownDispatch!: () => void + const shutdownDispatchStarted = new Promise((resolve) => { + resolveShutdownDispatch = resolve + }) + const dispatchStream: NonNullable = async ( + method, + input, + _caller, + _requestId, + _signal, + emit + ) => { + if (method !== modelsInvokeRoute.name) throw new Error(`Unexpected stream route: ${method}`) + const parsedInput = modelsInvokeRoute.input.parse(input) + if (parsedInput.messages.at(-1)?.content === 'wait-for-shutdown') { + resolveShutdownDispatch() + return await new Promise(() => undefined) + } + await emit(method, { type: 'text_delta', text: 'fixture reply' }) + await emit(method, { type: 'stop', reason: 'complete' }) + return { + providerId: parsedInput.providerId, + modelId: parsedInput.modelId, + text: 'fixture reply', + finishReason: 'complete', + latency: { queueMs: 0, firstEventMs: 1, firstTextMs: 1, totalMs: 5 } + } + } + server = new CliServer({ + userDataPath, + appVersion: 'packaged-smoke', + artifactSpool: spool, + dispatch: async (method, input, caller) => { + if (method === cliVersionRoute.name) { + return { + appVersion: 'packaged-smoke', + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + } + } + if (method === artifactsDescribeRoute.name) { + const parsedInput = artifactsDescribeRoute.input.parse(input) + return { artifact: await spool.describe(parsedInput.id, caller) } + } + throw new Error(`Unexpected RPC route: ${method}`) + }, + dispatchStream, + dispatchUpload: async (method, input, upload) => { + if (method !== ocrExtractUploadRoute.name) { + throw new Error(`Unexpected upload route: ${method}`) + } + expect(ocrExtractUploadRoute.input.parse(input)).toMatchObject({ + mimeType: 'image/png', + backend: 'auto' + }) + expect(await readFile(upload.path)).toEqual(ocrInput) + return { + kind: 'image', + mimeType: 'image/png', + text: 'fixture OCR text', + tokenCount: 3, + truncated: false, + engine: { + coreVersion: 'smoke', + modelBundleId: 'smoke-bundle', + requestedBackend: 'auto', + strategy: 'bounded-960', + detection: { providerChain: ['cpu'], precision: 'fp32' }, + recognition: { providerChain: ['cpu'], precision: 'fp32' } + }, + cacheHit: false, + benchmark: { + state: 'miss-warm', + runtimeStateBefore: 'ready', + runtimeWasReady: true, + inputBytes: ocrInput.length, + durationMs: 4, + appVersion: 'packaged-smoke', + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + }, + imageWidth: 1, + imageHeight: 1, + strategy: 'bounded-960', + timingMs: { snapshot: 1, preprocessing: 1, recognition: 2, total: 4 } + } + } + }) + const environment = cliEnvironment(userDataPath) + const runPackagedCli = async (args: readonly string[], env = environment) => + await execFileAsync(process.execPath, [entryPath, ...args], { + env, + timeout: CLI_PROCESS_TIMEOUT_MS + }) + + await server.start() + + const version = await runPackagedCli(['system', 'version', '--json']) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(version.stdout))).toMatchObject({ + ok: true, + result: { appVersion: 'packaged-smoke' } + }) + + const model = await runPackagedCli([ + 'model', + 'invoke', + '--provider', + 'fixture-provider', + '--model', + 'fixture-model', + '--prompt', + 'hello', + '--jsonl' + ]) + const modelRecords = model.stdout + .trimEnd() + .split('\n') + .map((line) => LocalControlStreamRecordSchema.parse(JSON.parse(line))) + expect(modelRecords).toHaveLength(3) + expect(modelRecords[0]).toMatchObject({ + event: modelsInvokeRoute.name, + data: { type: 'text_delta', text: 'fixture reply' } + }) + expect(modelRecords.at(-1)).toMatchObject({ + ok: true, + result: { text: 'fixture reply' } + }) + + const artifactResult = await runPackagedCli([ + 'artifact', + 'get', + '--id', + artifact.id, + '--out', + artifactOutputPath, + '--json' + ]) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(artifactResult.stdout))).toMatchObject({ + ok: true, + result: { artifact: { id: artifact.id } } + }) + expect(await readFile(artifactOutputPath)).toEqual(artifactBytes) + + const ocr = await runPackagedCli(['ocr', 'extract', '--file', ocrInputPath, '--json']) + expect(LocalControlRpcResponseSchema.parse(JSON.parse(ocr.stdout))).toMatchObject({ + ok: true, + result: { + text: 'fixture OCR text', + benchmark: { state: 'miss-warm', runtimeWasReady: true } + } + }) + + const agentEnvironment = cliEnvironment(userDataPath, { + [LOCAL_CONTROL_AGENT_TOKEN_ENV]: 'a'.repeat(43) + }) + await expect( + runPackagedCli(['ocr', 'extract', '--file', ocrInputPath, '--json'], agentEnvironment) + ).rejects.toMatchObject({ + code: 4, + stdout: expect.stringContaining('"code":"permission_denied"') + }) + + const activeCli = runPackagedCli([ + 'model', + 'invoke', + '--provider', + 'fixture-provider', + '--model', + 'fixture-model', + '--prompt', + 'wait-for-shutdown', + '--jsonl' + ]) + await shutdownDispatchStarted + await server.stop() + await expect(activeCli).rejects.toMatchObject({ + code: 3, + stdout: expect.stringContaining('"code":"unavailable"') + }) + } finally { + await server?.stop() + await spool.close() + await rm(temporaryDirectory, { recursive: true }) + } + } + + it( + 'covers diagnostics, compute, artifacts, OCR, Agent policy, and desktop shutdown', + runPackagedCliSmoke, + PACKAGED_SMOKE_TIMEOUT_MS + ) +}) diff --git a/test/main/cli/policy.test.ts b/test/main/cli/policy.test.ts new file mode 100644 index 0000000000..bf97588cf2 --- /dev/null +++ b/test/main/cli/policy.test.ts @@ -0,0 +1,429 @@ +import { z } from 'zod' +import { describe, expect, it, vi } from 'vitest' +import { defineRouteContract } from '@shared/contracts/contract' +import type { LocalControlEffect } from '@shared/contracts/localControl' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import { CliRequestPolicy, type CliPolicyAuditRecord } from '@/cli/policy' +import type { CliMutationGuard } from '@/cli/mutationGuard' +import { getCliSurfaceEntry, type CliSurfaceEntry } from '@/cli/surface' + +const testRoute = defineRouteContract({ + name: 'settings.testMutation', + input: z.object({ secret: z.string().optional() }), + output: z.object({ ok: z.boolean() }) +}) + +const humanCaller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'human-connection', + scopes: ['settings:write'] +} + +const agentCaller: CliRouteCaller = { + kind: 'cli', + principal: 'agent', + connectionId: 'agent-connection', + tokenId: 'token-id-conversation-1', + conversationId: 'conversation-1', + expiresAt: Date.now() + 60_000, + scopes: ['settings:write'] +} + +function entry( + effect: LocalControlEffect, + approval: 'never' | 'policy' = 'never', + agentPolicy?: CliSurfaceEntry['agentPolicy'] +) { + return { + contract: testRoute, + effect, + callers: ['human', 'agent'], + scopes: ['settings:write'], + transport: 'rpc', + approval, + ...(agentPolicy ? { agentPolicy } : {}), + auditProjection: () => ({ target: 'safe-setting' }), + ...(approval === 'policy' ? { approvalDisplay: () => ({ target: 'safe-setting' }) } : {}), + limits: { maxBodyBytes: 1024, timeoutMs: 5_000 } + } satisfies CliSurfaceEntry +} + +function createHarness( + options: { + allowlisted?: boolean + agentComputeLimit?: number + agentComputeStartsPerMinute?: number + audit?: (record: CliPolicyAuditRecord) => void | Promise + } = {} +) { + const auditRecords: CliPolicyAuditRecord[] = [] + const authorize = vi.fn(async () => ({ approvalRequestId: 'approval-request-1234' })) + const mutationGuard = { authorize } as unknown as CliMutationGuard + const policy = new CliRequestPolicy({ + mutationGuard, + audit: options.audit ?? ((record) => auditRecords.push(record)), + agentComputeLimit: options.agentComputeLimit, + agentComputeStartsPerMinute: options.agentComputeStartsPerMinute + }) + const invoke = ( + effect: LocalControlEffect, + caller: CliRouteCaller, + approval: 'never' | 'policy' = 'never' + ) => + policy.authorize({ + entry: entry(effect, approval, options.allowlisted ? 'approval' : undefined), + input: { secret: 'must-not-appear-in-audit' }, + caller, + requestId: 'request-1', + signal: new AbortController().signal + }) + + return { auditRecords, authorize, invoke, policy } +} + +describe('CliRequestPolicy', () => { + it.each(['read', 'compute', 'local-maintenance', 'preference-write'] as const)( + 'allows the human %s effect without approval', + async (effect) => { + const harness = createHarness() + await expect(harness.invoke(effect, humanCaller)).resolves.toBeDefined() + expect(harness.authorize).not.toHaveBeenCalled() + expect(harness.auditRecords.at(-1)?.outcome).toBe('allowed') + } + ) + + it.each([ + 'security-config', + 'execution-config', + 'supply-chain', + 'credential', + 'destructive' + ] as const)('requires renderer approval for the human %s effect', async (effect) => { + const harness = createHarness() + await expect(harness.invoke(effect, humanCaller, 'policy')).resolves.toBeDefined() + expect(harness.authorize).toHaveBeenCalledOnce() + expect(harness.auditRecords.at(-1)).toMatchObject({ + outcome: 'approved', + approvalRequestId: 'approval-request-1234' + }) + }) + + it('denies agent maintenance and destructive effects', async () => { + const harness = createHarness() + await expect(harness.invoke('local-maintenance', agentCaller)).rejects.toMatchObject({ + code: 'permission_denied' + }) + await expect(harness.invoke('destructive', agentCaller, 'policy')).rejects.toMatchObject({ + code: 'permission_denied' + }) + expect(harness.authorize).not.toHaveBeenCalled() + expect(harness.auditRecords.map((record) => record.outcome)).toEqual(['denied', 'denied']) + }) + + it('allows only explicitly opted-in Agent maintenance operations', async () => { + const harness = createHarness() + + await expect( + harness.policy.authorize({ + entry: entry('local-maintenance', 'never', 'allow'), + input: {}, + caller: agentCaller, + requestId: 'request-agent-maintenance', + signal: new AbortController().signal + }) + ).resolves.toBeDefined() + expect(harness.authorize).not.toHaveBeenCalled() + expect(harness.auditRecords.at(-1)?.outcome).toBe('allowed') + }) + + it('requires an explicit operation allowlist before an agent may request approval', async () => { + const denied = createHarness() + await expect(denied.invoke('supply-chain', agentCaller, 'policy')).rejects.toMatchObject({ + code: 'permission_denied' + }) + + const allowed = createHarness({ allowlisted: true }) + await expect(allowed.invoke('supply-chain', agentCaller, 'policy')).resolves.toBeDefined() + expect(allowed.authorize).toHaveBeenCalledOnce() + await expect(allowed.invoke('execution-config', agentCaller, 'policy')).rejects.toMatchObject({ + code: 'permission_denied' + }) + await expect(allowed.invoke('credential', agentCaller, 'policy')).rejects.toMatchObject({ + code: 'permission_denied' + }) + expect(allowed.authorize).toHaveBeenCalledOnce() + }) + + it('applies concrete Agent surface policies without widening denied effects', async () => { + const harness = createHarness() + const authorize = (input: { + entry: CliSurfaceEntry + params: unknown + caller: CliRouteCaller + requestId: string + }) => + harness.policy.authorize({ + entry: input.entry, + input: input.params, + caller: input.caller, + requestId: input.requestId, + signal: new AbortController().signal + }) + const settingEntry = getCliSurfaceEntry('settings.updatePublic')! + + await expect( + authorize({ + entry: settingEntry, + params: { changes: [{ key: 'fontSizeLevel', value: 3 }] }, + caller: agentCaller, + requestId: 'request-setting-preference' + }) + ).resolves.toBeDefined() + await expect( + authorize({ + entry: settingEntry, + params: { changes: [{ key: 'loggingEnabled', value: true }] }, + caller: agentCaller, + requestId: 'request-setting-security' + }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + + const mcpCaller: CliRouteCaller = { ...agentCaller, scopes: ['mcp:write'] } + const mcpEntry = getCliSurfaceEntry('mcp.addPublic')! + await expect( + authorize({ + entry: mcpEntry, + params: { + serverName: 'safe-server', + config: { + type: 'http', + description: '', + icon: '', + baseUrl: 'https://mcp.example/api', + headers: {} + } + }, + caller: mcpCaller, + requestId: 'request-mcp-supply-chain' + }) + ).resolves.toBeDefined() + await expect( + authorize({ + entry: mcpEntry, + params: { + serverName: 'credential-server', + config: { + type: 'http', + baseUrl: 'https://mcp.example/api', + headers: { Authorization: 'Bearer secret' } + } + }, + caller: mcpCaller, + requestId: 'request-mcp-credential' + }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + + await expect( + authorize({ + entry: getCliSurfaceEntry('mcp.updatePublic')!, + params: { serverName: 'safe-server', updates: { description: 'renamed' } }, + caller: mcpCaller, + requestId: 'request-mcp-update' + }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + + const runCaller: CliRouteCaller = { ...agentCaller, scopes: ['runs:cancel'] } + await expect( + authorize({ + entry: getCliSurfaceEntry('runs.cancel')!, + params: { runId: 'conversation-1' }, + caller: runCaller, + requestId: 'request-run-cancel' + }) + ).resolves.toBeDefined() + expect(harness.authorize).toHaveBeenCalledTimes(2) + }) + + it('fails closed when an approval effect lacks approval surface metadata', async () => { + const harness = createHarness() + + await expect(harness.invoke('credential', humanCaller)).rejects.toMatchObject({ + code: 'internal_error' + }) + expect(harness.authorize).not.toHaveBeenCalled() + expect(harness.auditRecords.at(-1)?.outcome).toBe('misconfigured') + }) + + it('resolves input-dependent effects and rejects undeclared resolver output', async () => { + const harness = createHarness() + const dynamicEntry = { + ...entry('read', 'policy'), + effect: { + possible: ['preference-write', 'security-config'], + resolve: (input: unknown) => + (input as { secure?: boolean }).secure ? 'security-config' : 'preference-write' + } + } satisfies CliSurfaceEntry + + await expect( + harness.policy.authorize({ + entry: dynamicEntry, + input: { secure: false }, + caller: humanCaller, + requestId: 'request-preference', + signal: new AbortController().signal + }) + ).resolves.toBeDefined() + expect(harness.authorize).not.toHaveBeenCalled() + await expect( + harness.policy.authorize({ + entry: dynamicEntry, + input: { secure: true }, + caller: humanCaller, + requestId: 'request-security', + signal: new AbortController().signal + }) + ).resolves.toBeDefined() + expect(harness.authorize).toHaveBeenCalledOnce() + expect(harness.auditRecords.map((record) => record.effect)).toEqual([ + 'preference-write', + 'security-config' + ]) + + await expect( + harness.policy.authorize({ + entry: { + ...dynamicEntry, + effect: { possible: ['read'], resolve: () => 'destructive' } + }, + input: {}, + caller: humanCaller, + requestId: 'request-invalid-effect', + signal: new AbortController().signal + }) + ).rejects.toMatchObject({ code: 'internal_error' }) + }) + + it('applies input-level agent restrictions before requesting approval', async () => { + const harness = createHarness({ allowlisted: true }) + + await expect( + harness.policy.authorize({ + entry: { ...entry('preference-write', 'policy'), agentInputAllowed: () => false }, + input: {}, + caller: agentCaller, + requestId: 'request-agent-input', + signal: new AbortController().signal + }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + expect(harness.authorize).not.toHaveBeenCalled() + expect(harness.auditRecords.at(-1)?.outcome).toBe('denied') + }) + + it('fails closed when an input-level agent policy throws', async () => { + const harness = createHarness({ allowlisted: true }) + + await expect( + harness.policy.authorize({ + entry: { + ...entry('preference-write', 'policy'), + agentInputAllowed: () => { + throw new Error('broken policy') + } + }, + input: {}, + caller: agentCaller, + requestId: 'request-agent-policy-error', + signal: new AbortController().signal + }) + ).rejects.toMatchObject({ code: 'internal_error' }) + expect(harness.authorize).not.toHaveBeenCalled() + }) + + it('audits and denies callers or scopes excluded by the surface entry', async () => { + const harness = createHarness() + await expect( + harness.policy.authorize({ + entry: { ...entry('read'), callers: ['human'] }, + input: {}, + caller: agentCaller, + requestId: 'request-caller', + signal: new AbortController().signal + }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + await expect( + harness.policy.authorize({ + entry: entry('read'), + input: {}, + caller: { ...humanCaller, scopes: [] }, + requestId: 'request-scope', + signal: new AbortController().signal + }) + ).rejects.toMatchObject({ code: 'permission_denied' }) + + expect(harness.auditRecords.map((record) => record.outcome)).toEqual(['denied', 'denied']) + expect(harness.authorize).not.toHaveBeenCalled() + }) + + it('keeps raw secrets and prompts out of the structured audit record', async () => { + const harness = createHarness() + await harness.invoke('read', humanCaller) + + expect(JSON.stringify(harness.auditRecords)).not.toContain('must-not-appear-in-audit') + expect(harness.auditRecords[0].redactedArgumentsHash).toMatch(/^[a-f0-9]{64}$/) + }) + + it('binds upload metadata to mutation approval without exposing raw params', async () => { + const harness = createHarness() + const transportBinding = { size: 11, sha256: 'a'.repeat(64) } + + await harness.policy.authorize({ + entry: entry('supply-chain', 'policy'), + input: { secret: 'must-be-bound' }, + transportBinding, + caller: humanCaller, + requestId: 'request-upload', + signal: new AbortController().signal + }) + + expect(harness.authorize).toHaveBeenCalledWith( + expect.objectContaining({ + arguments: { params: { secret: 'must-be-bound' }, transport: transportBinding }, + displayData: { request: { target: 'safe-setting' }, transport: transportBinding } + }) + ) + expect(JSON.stringify(harness.auditRecords)).not.toContain('must-be-bound') + }) + + it('limits concurrent and burst agent compute per conversation and releases idempotently', async () => { + const harness = createHarness({ agentComputeLimit: 1, agentComputeStartsPerMinute: 2 }) + const first = await harness.invoke('compute', agentCaller) + await expect(harness.invoke('compute', agentCaller)).rejects.toMatchObject({ + code: 'rate_limited' + }) + first.release() + first.release() + + const second = await harness.invoke('compute', agentCaller) + second.release() + await expect(harness.invoke('compute', agentCaller)).rejects.toMatchObject({ + code: 'rate_limited' + }) + }) + + it('fails closed and releases compute admission when the audit sink fails', async () => { + let shouldFail = true + const harness = createHarness({ + agentComputeLimit: 1, + audit: async () => { + if (shouldFail) throw new Error('audit unavailable') + } + }) + + await expect(harness.invoke('compute', agentCaller)).rejects.toThrow('audit unavailable') + shouldFail = false + const admission = await harness.invoke('compute', agentCaller) + admission.release() + }) +}) diff --git a/test/main/cli/providerModelAdminRoutes.test.ts b/test/main/cli/providerModelAdminRoutes.test.ts new file mode 100644 index 0000000000..6531e8c5f2 --- /dev/null +++ b/test/main/cli/providerModelAdminRoutes.test.ts @@ -0,0 +1,387 @@ +import { describe, expect, it, vi } from 'vitest' +import { + modelsGetPublicConfigRoute, + modelsSetPublicConfigRoute, + providersAddPublicRoute, + providersSetCredentialRoute, + providersTestPublicConnectionRoute, + providersUpdatePublicRoute +} from '@shared/contracts/routes' +import type { LLM_PROVIDER, ModelConfig } from '@shared/types/provider' +import { createCliProviderModelAdminRoutes } from '@/cli/providerModelAdminRoutes' +import type { CliRouteCaller, RouteContext } from '@/routes/routeRegistry' + +const caller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['providers:write', 'providers:credential'] +} + +function createHarness(initialProviders: LLM_PROVIDER[] = []) { + const providers = new Map(initialProviders.map((provider) => [provider.id, provider])) + const defaultModelConfig: ModelConfig = { + maxTokens: 4096, + contextLength: 32768, + vision: false, + functionCall: true, + reasoning: true, + type: 'chat' as ModelConfig['type'] + } + const modelConfigs = new Map() + const setModelConfig = vi.fn((modelId: string, providerId: string, config: ModelConfig) => { + modelConfigs.set(`${providerId}:${modelId}`, config) + }) + const addProviderAtomic = vi.fn((provider: LLM_PROVIDER) => providers.set(provider.id, provider)) + const updateProviderAtomic = vi.fn((providerId: string, updates: Partial) => { + const provider = providers.get(providerId) + if (!provider) return false + providers.set(providerId, { ...provider, ...updates }) + return 'apiType' in updates || 'baseUrl' in updates + }) + const check = vi.fn(async () => ({ + isOk: false, + errorMsg: 'Request failed with Authorization: Bearer super-secret' + })) + const recordSettingsActivity = vi.fn() + const log = { warn: vi.fn() } + const routes = createCliProviderModelAdminRoutes({ + providerSettings: { + getProviderById: (providerId) => providers.get(providerId), + getModelConfig: (modelId, providerId) => + modelConfigs.get(`${providerId}:${modelId}`) ?? defaultModelConfig, + isKnownModel: (_providerId, modelId) => modelId === 'model-1', + setModelConfig + }, + providerRuntime: { addProviderAtomic, check, updateProviderAtomic }, + scheduler: { + timeout: async ({ task }: { task: Promise }) => await task + }, + recordSettingsActivity, + createProviderId: () => 'provider-generated', + log + }) + const invoke = async (method: string, input: unknown, context: RouteContext = { caller }) => { + const route = routes.get(method as never) + if (!route) throw new Error(`Missing route: ${method}`) + return await route(input, context) + } + return { + providers, + addProviderAtomic, + check, + updateProviderAtomic, + setModelConfig, + recordSettingsActivity, + modelConfigs, + log, + invoke + } +} + +describe('CLI provider administration routes', () => { + it('adds only a credential-free custom provider and returns a redacted summary', async () => { + const harness = createHarness() + + await expect( + harness.invoke(providersAddPublicRoute.name, { + name: 'Private endpoint', + apiType: 'openai-completions', + baseUrl: 'https://models.example/v1', + enabled: true + }) + ).resolves.toEqual({ + provider: { + id: 'provider-generated', + name: 'Private endpoint', + apiType: 'openai-completions', + enabled: true, + custom: true, + storedCredentialConfigured: false + } + }) + expect(harness.addProviderAtomic).toHaveBeenCalledWith( + expect.objectContaining({ + id: 'provider-generated', + apiKey: '', + custom: true + }) + ) + }) + + it('updates only allowlisted fields and protects built-in provider identity', async () => { + const custom: LLM_PROVIDER = { + id: 'custom-1', + name: 'Custom', + apiType: 'openai', + apiKey: 'secret', + baseUrl: 'https://old.example/v1', + enable: true, + custom: true + } + const builtin: LLM_PROVIDER = { ...custom, id: 'builtin-1', custom: false } + const harness = createHarness([custom, builtin]) + + await expect( + harness.invoke(providersUpdatePublicRoute.name, { + providerId: custom.id, + updates: { apiType: 'anthropic', enabled: false } + }) + ).resolves.toMatchObject({ + provider: { + id: custom.id, + apiType: 'anthropic', + enabled: false, + storedCredentialConfigured: true + }, + requiresRebuild: true + }) + expect(harness.providers.get(custom.id)?.apiKey).toBe('secret') + + await expect( + harness.invoke(providersUpdatePublicRoute.name, { + providerId: builtin.id, + updates: { apiType: 'gemini' } + }) + ).rejects.toMatchObject({ code: 'conflict' }) + }) + + it('sets and clears API keys without returning credential material', async () => { + const provider: LLM_PROVIDER = { + id: 'provider-1', + name: 'Provider', + apiType: 'openai', + apiKey: '', + baseUrl: 'https://api.example/v1', + enable: true, + custom: true + } + const harness = createHarness([provider]) + + const setResult = await harness.invoke(providersSetCredentialRoute.name, { + providerId: provider.id, + action: 'set', + kind: 'api-key', + value: 'super-secret ' + }) + expect(setResult).toEqual({ + providerId: provider.id, + action: 'set', + kind: 'api-key', + storedApiKeyConfigured: true + }) + expect(JSON.stringify(setResult)).not.toContain('super-secret') + expect(harness.providers.get(provider.id)?.apiKey).toBe('super-secret ') + + await expect( + harness.invoke(providersSetCredentialRoute.name, { + providerId: provider.id, + action: 'clear', + kind: 'api-key' + }) + ).resolves.toMatchObject({ action: 'clear', storedApiKeyConfigured: false }) + expect(harness.providers.get(provider.id)?.apiKey).toBe('') + }) + + it('redacts provider implementation errors from public connection tests', async () => { + const provider: LLM_PROVIDER = { + id: 'provider-1', + name: 'Provider', + apiType: 'openai', + apiKey: 'super-secret', + baseUrl: 'https://api.example/v1', + enable: true, + custom: true + } + const harness = createHarness([provider]) + + const result = await harness.invoke(providersTestPublicConnectionRoute.name, { + providerId: provider.id + }) + expect(result).toEqual({ isOk: false, errorMsg: 'Provider connection failed' }) + expect(JSON.stringify(result)).not.toContain('super-secret') + }) + + it('rejects renderer callers and URLs that can hide credential material', async () => { + const harness = createHarness() + + await expect( + harness.invoke( + providersAddPublicRoute.name, + { + name: 'Provider', + apiType: 'openai', + baseUrl: 'https://api.example/v1' + }, + { caller: { kind: 'renderer', webContentsId: 1, windowId: 1 } } + ) + ).rejects.toMatchObject({ code: 'permission_denied' }) + expect( + providersAddPublicRoute.input.safeParse({ + name: 'Provider', + apiType: 'openai', + baseUrl: 'https://user:password@api.example/v1?api_key=secret' + }).success + ).toBe(false) + expect( + providersSetCredentialRoute.input.safeParse({ + providerId: 'provider-1', + action: 'set', + kind: 'api-key', + value: '密'.repeat(22_000) + }).success + ).toBe(false) + }) + + it('returns validation failures for malformed provider URLs', () => { + const addResult = providersAddPublicRoute.input.safeParse({ + name: 'Provider', + apiType: 'openai', + baseUrl: 'not-a-url' + }) + const updateResult = providersUpdatePublicRoute.input.safeParse({ + providerId: 'provider-1', + updates: { baseUrl: 'not-a-url' } + }) + + expect(addResult.success).toBe(false) + expect(updateResult.success).toBe(false) + expect( + providersAddPublicRoute.input.safeParse({ + name: 'Local provider', + apiType: 'openai', + baseUrl: 'http://localhost:11434' + }).success + ).toBe(true) + }) + + it('uses strict public model config input and strips main-owned identity fields', async () => { + const provider: LLM_PROVIDER = { + id: 'provider-1', + name: 'Provider', + apiType: 'openai', + apiKey: '', + baseUrl: 'https://api.example/v1', + enable: true, + custom: true + } + const harness = createHarness([provider]) + const config = { + maxTokens: 2048, + contextLength: 16384, + vision: false, + functionCall: false, + reasoning: false, + type: 'chat' + } + + await expect( + harness.invoke(modelsSetPublicConfigRoute.name, { + providerId: provider.id, + modelId: 'model-1', + config + }) + ).resolves.toEqual({ config }) + expect(harness.modelConfigs.get(`${provider.id}:model-1`)).toEqual(config) + expect( + modelsSetPublicConfigRoute.input.safeParse({ + providerId: provider.id, + modelId: 'model-1', + config: { ...config, conversationId: 'private-session', futureSecret: 'secret' } + }).success + ).toBe(false) + + harness.modelConfigs.set(`${provider.id}:model-1`, { + ...config, + conversationId: 'private-session', + ownedBy: 'internal-owner' + } as ModelConfig) + const result = await harness.invoke(modelsGetPublicConfigRoute.name, { + providerId: provider.id, + modelId: 'model-1' + }) + expect(result).toEqual({ config }) + expect(JSON.stringify(result)).not.toContain('private-session') + }) + + it('normalizes mutation storage failures without exposing their details', async () => { + const privateFailure = 'EIO /private/provider.json?token=secret' + const provider: LLM_PROVIDER = { + id: 'provider-1', + name: 'Provider', + apiType: 'openai', + apiKey: '', + baseUrl: 'https://api.example/v1', + enable: true, + custom: true + } + const unavailable = { + code: 'unavailable', + httpStatus: 503, + retriable: true + } + + const addHarness = createHarness() + addHarness.addProviderAtomic.mockImplementationOnce(() => { + throw new Error(privateFailure) + }) + await expect( + addHarness.invoke(providersAddPublicRoute.name, { + name: 'Provider', + apiType: 'openai', + baseUrl: 'https://api.example/v1' + }) + ).rejects.toMatchObject({ ...unavailable, message: 'Could not add provider' }) + + const updateHarness = createHarness([provider]) + updateHarness.updateProviderAtomic.mockImplementation(() => { + throw new Error(privateFailure) + }) + await expect( + updateHarness.invoke(providersUpdatePublicRoute.name, { + providerId: provider.id, + updates: { name: 'Updated' } + }) + ).rejects.toMatchObject({ ...unavailable, message: 'Could not update provider' }) + await expect( + updateHarness.invoke(providersSetCredentialRoute.name, { + providerId: provider.id, + action: 'clear', + kind: 'api-key' + }) + ).rejects.toMatchObject({ + ...unavailable, + message: 'Could not update provider credential' + }) + + const modelHarness = createHarness([provider]) + modelHarness.setModelConfig.mockImplementationOnce(() => { + throw new Error(privateFailure) + }) + await expect( + modelHarness.invoke(modelsSetPublicConfigRoute.name, { + providerId: provider.id, + modelId: 'model-1', + config: { + maxTokens: 2048, + contextLength: 16384, + vision: false, + functionCall: false, + reasoning: false, + type: 'chat' + } + }) + ).rejects.toMatchObject({ + ...unavailable, + message: 'Could not update model configuration' + }) + + expect( + JSON.stringify([ + addHarness.log.warn.mock.calls, + updateHarness.log.warn.mock.calls, + modelHarness.log.warn.mock.calls + ]) + ).not.toContain(privateFailure) + }) +}) diff --git a/test/main/cli/publicText.test.ts b/test/main/cli/publicText.test.ts new file mode 100644 index 0000000000..d2c83742f3 --- /dev/null +++ b/test/main/cli/publicText.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it } from 'vitest' +import { stripC0AndC1Controls } from '@/cli/publicText' + +describe('CLI public text', () => { + it('filters controls within an explicit scan bound', () => { + expect(stripC0AndC1Controls('safe\0text\u0085', 10)).toBe('safetext') + }) + + it('rejects text beyond its scan bound before filtering', () => { + expect(() => stripC0AndC1Controls('over-limit', 9)).toThrow( + 'Public text exceeds its scan limit' + ) + }) +}) diff --git a/test/main/cli/runService.test.ts b/test/main/cli/runService.test.ts new file mode 100644 index 0000000000..e907ccd8f7 --- /dev/null +++ b/test/main/cli/runService.test.ts @@ -0,0 +1,519 @@ +import { describe, expect, it, vi } from 'vitest' +import { + RUN_MESSAGE_MAX_TEXT_BYTES, + RUN_PROMPT_MAX_CHARACTERS, + PublicRunMessageSchema, + eventsSubscribeRoute, + runsCancelRoute, + runsGetRoute, + sessionsRunDetachedRoute +} from '@shared/contracts/routes' +import type { + ChatMessageRecord, + SessionRecord, + SessionWithState +} from '@shared/types/agent-interface' +import { DEFAULT_ORCHESTRATION_POLICY } from '@shared/orchestration/policy' +import { LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES } from '@shared/contracts/localControl' +import { CliRunService, type CliRunServiceOptions } from '@/cli/runService' +import { CliRequestError } from '@/cli/errors' +import { TypedEventHub, type TypedEventRecord } from '@/events/typedEventHub' +import type { CliRouteCaller, RouteContext } from '@/routes/routeRegistry' + +const humanCaller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['sessions:run', 'runs:read', 'runs:cancel'] +} + +const agentCaller: CliRouteCaller = { + kind: 'cli', + principal: 'agent', + connectionId: 'connection-agent', + tokenId: 'token-id-run-1', + conversationId: 'run-1', + expiresAt: 10_000, + scopes: ['runs:read', 'runs:cancel'] +} + +const baseSession: SessionWithState = { + id: 'run-1', + agentId: 'deepchat', + title: 'CLI Run', + projectDir: null, + isPinned: false, + isDraft: false, + sessionKind: 'regular', + parentSessionId: null, + subagentMeta: null, + orchestrationPolicy: DEFAULT_ORCHESTRATION_POLICY, + createdAt: 100, + updatedAt: 101, + metadata: { source: 'cli_run' }, + status: 'generating', + providerId: 'provider-1', + modelId: 'model-1' +} + +function createMessage(overrides: Partial): ChatMessageRecord { + return { + id: 'message-1', + sessionId: 'run-1', + orderSeq: 1, + role: 'user', + content: JSON.stringify({ text: 'hello', files: [] }), + status: 'sent', + isContextEdge: 0, + metadata: JSON.stringify({ provider: 'private-provider-detail' }), + createdAt: 100, + updatedAt: 101, + ...overrides + } +} + +function createHarness( + overrides: { + session?: SessionWithState + storedSession?: SessionRecord | null + messages?: ChatMessageRecord[] + } = {} +): { + service: CliRunService + hub: TypedEventHub + lifecycle: CliRunServiceOptions['lifecycle'] + turn: CliRunServiceOptions['turn'] + projection: CliRunServiceOptions['projection'] + sessions: CliRunServiceOptions['sessions'] + log: { warn: ReturnType } +} { + const session = overrides.session ?? baseSession + const lifecycle = { + createDetachedSession: vi.fn(async () => ({ ...session, status: 'idle' as const })) + } + const turn = { + sendMessage: vi.fn(async () => ({ requestId: 'request-1', messageId: 'message-2' })), + cancelGeneration: vi.fn(async () => undefined) + } + const projection = { + getSession: vi.fn(async () => session), + listMessagesPage: vi.fn(async () => ({ + messages: overrides.messages ?? [], + nextCursor: null, + hasMore: false + })) + } + const sessions = { + get: vi.fn(() => + overrides.storedSession === undefined ? (session as SessionRecord) : overrides.storedSession + ) + } + const log = { warn: vi.fn() } + const hub = new TypedEventHub({ + renderer: { broadcast: vi.fn(), send: vi.fn() }, + epoch: 'test-epoch', + now: () => 200 + }) + return { + service: new CliRunService({ + lifecycle, + turn, + projection, + sessions, + eventHub: hub, + now: () => 200, + log + }), + hub, + lifecycle, + turn, + projection, + sessions, + log + } +} + +async function invokeRoute( + service: CliRunService, + method: string, + input: unknown, + caller: RouteContext['caller'] = humanCaller +): Promise { + const route = service.createRoutes().get(method as never) + if (!route) throw new Error(`Missing route: ${method}`) + return await route(input, { caller }) +} + +async function nextEvent(events: AsyncIterable): Promise { + const result = await events[Symbol.asyncIterator]().next() + if (result.done) throw new Error('Expected an event') + return result.value +} + +describe('CliRunService', () => { + it('creates a durable default-permission session before starting its initial turn', async () => { + const { service, hub, lifecycle, turn } = createHarness() + const events = hub.subscribe({ kind: 'run', runId: 'run-1' }) + + await expect( + invokeRoute(service, sessionsRunDetachedRoute.name, { + prompt: 'Run the benchmark', + providerId: 'provider-1', + modelId: 'model-1', + systemPrompt: 'Be concise', + maxTurns: 4 + }) + ).resolves.toEqual({ + runId: 'run-1', + sessionId: 'run-1', + status: 'generating', + requestId: 'request-1', + messageId: 'message-2', + createdAt: 100 + }) + + expect(lifecycle.createDetachedSession).toHaveBeenCalledWith({ + title: 'CLI Run', + providerId: 'provider-1', + modelId: 'model-1', + permissionMode: 'default', + generationSettings: { systemPrompt: 'Be concise' }, + metadata: { source: 'cli_run' } + }) + expect(turn.sendMessage).toHaveBeenCalledWith('run-1', 'Run the benchmark', { + maxProviderRounds: 4 + }) + await expect(nextEvent(events.events)).resolves.toMatchObject({ event: 'runs.created' }) + await expect(nextEvent(events.events)).resolves.toMatchObject({ event: 'runs.turn.accepted' }) + }) + + it('keeps detached creation human-only even if an Agent reaches the handler', async () => { + const { service, lifecycle } = createHarness() + + await expect( + invokeRoute(service, sessionsRunDetachedRoute.name, { prompt: 'recurse' }, agentCaller) + ).rejects.toMatchObject({ code: 'permission_denied' }) + expect(lifecycle.createDetachedSession).not.toHaveBeenCalled() + }) + + it('rejects oversized prompts before creating a durable session', async () => { + const { service, lifecycle } = createHarness() + + await expect( + invokeRoute(service, sessionsRunDetachedRoute.name, { + prompt: 'x'.repeat(RUN_PROMPT_MAX_CHARACTERS + 1) + }) + ).rejects.toMatchObject({ + issues: expect.arrayContaining([ + expect.objectContaining({ code: 'too_big', path: ['prompt'] }) + ]) + }) + expect(lifecycle.createDetachedSession).not.toHaveBeenCalled() + }) + + it('returns the durable run identity when initial turn startup fails', async () => { + const { service, turn, hub, log } = createHarness() + const events = hub.subscribe({ kind: 'run', runId: 'run-1' }) + const privateFailure = 'EACCES /Users/private/provider.json?token=secret' + vi.mocked(turn.sendMessage).mockRejectedValueOnce(new Error(privateFailure)) + + const failure = await invokeRoute(service, sessionsRunDetachedRoute.name, { + prompt: 'hello' + }).catch((error: unknown) => error) + expect(failure).toMatchObject({ + code: 'conflict', + message: 'Detached Agent run could not start', + options: { details: { runId: 'run-1', sessionId: 'run-1' } } + }) + await expect(nextEvent(events.events)).resolves.toMatchObject({ event: 'runs.created' }) + await expect(nextEvent(events.events)).resolves.toMatchObject({ + event: 'runs.turn.failed', + data: { error: 'Detached Agent run could not start' } + }) + expect(JSON.stringify(failure)).not.toContain(privateFailure) + expect(log.warn).toHaveBeenCalledWith('[CLI] Failed to start detached Agent run', { + runId: 'run-1', + failure: { name: 'Error' } + }) + }) + + it('returns bounded public message text without internal message metadata', async () => { + const oversized = '🙂'.repeat(RUN_MESSAGE_MAX_TEXT_BYTES) + const { service } = createHarness({ + messages: [ + createMessage({}), + createMessage({ + id: 'message-2', + orderSeq: 2, + role: 'assistant', + content: JSON.stringify([{ type: 'content', content: oversized }]) + }) + ] + }) + + const result = runsGetRoute.output.parse( + await invokeRoute(service, runsGetRoute.name, { runId: 'run-1' }) + ) + + expect(result.messages[0]).toMatchObject({ role: 'user', text: 'hello' }) + expect(result.messages[1].textTruncated).toBe(true) + expect(Buffer.byteLength(result.messages[1].text, 'utf8')).toBeLessThanOrEqual( + RUN_MESSAGE_MAX_TEXT_BYTES + ) + expect(JSON.stringify(result)).not.toContain('private-provider-detail') + }) + + it('enforces the public message limit in UTF-8 bytes', () => { + const message = { + id: 'message-1', + role: 'assistant' as const, + status: 'sent' as const, + textTruncated: false, + createdAt: 100, + updatedAt: 101 + } + + expect( + PublicRunMessageSchema.safeParse({ + ...message, + text: 'x'.repeat(RUN_MESSAGE_MAX_TEXT_BYTES) + }).success + ).toBe(true) + expect( + PublicRunMessageSchema.safeParse({ + ...message, + text: '🙂'.repeat(RUN_MESSAGE_MAX_TEXT_BYTES / 4 + 1) + }).success + ).toBe(false) + }) + + it('keeps escaped transcript pages within the local response byte limit', async () => { + const messages = Array.from({ length: 16 }, (_, index) => + createMessage({ + id: `message-${index + 1}`, + orderSeq: index + 1, + role: 'assistant', + content: JSON.stringify([ + { type: 'content', content: '\0'.repeat(RUN_MESSAGE_MAX_TEXT_BYTES) } + ]) + }) + ) + const { service } = createHarness({ messages }) + + const result = runsGetRoute.output.parse( + await invokeRoute(service, runsGetRoute.name, { runId: 'run-1', limit: messages.length }) + ) + + expect(result.messages.length).toBeLessThan(messages.length) + expect(result.hasMore).toBe(true) + const firstIncluded = messages.find((message) => message.id === result.messages[0]?.id) + expect(result.nextCursor).toEqual({ + orderSeq: firstIncluded?.orderSeq, + id: firstIncluded?.id + }) + expect(Buffer.byteLength(JSON.stringify(result), 'utf8')).toBeLessThan( + LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES + ) + }) + + it('hides non-CLI sessions from a human while allowing an Agent to inspect its own session', async () => { + const normalSession = { ...baseSession, metadata: undefined } + const { service } = createHarness({ session: normalSession, storedSession: normalSession }) + + await expect(invokeRoute(service, runsGetRoute.name, { runId: 'run-1' })).rejects.toMatchObject( + { code: 'not_found', httpStatus: 404 } + ) + await expect( + invokeRoute(service, runsGetRoute.name, { runId: 'run-1' }, agentCaller) + ).resolves.toMatchObject({ runId: 'run-1' }) + }) + + it('fails closed instead of waiting on a normal session with no run event stream', async () => { + const normalSession = { ...baseSession, metadata: undefined } + const { service } = createHarness({ session: normalSession, storedSession: normalSession }) + + await expect( + service.dispatchStream( + eventsSubscribeRoute.name, + { runId: 'run-1' }, + agentCaller, + new AbortController().signal, + vi.fn() + ) + ).rejects.toMatchObject({ code: 'not_found', httpStatus: 404 }) + }) + + it('makes cancellation idempotent and only emits for an active run', async () => { + const idleSession = { ...baseSession, status: 'idle' as const } + const { service, hub, projection, turn } = createHarness() + vi.mocked(projection.getSession) + .mockResolvedValueOnce(baseSession) + .mockResolvedValueOnce(idleSession) + .mockResolvedValue(idleSession) + const events = hub.subscribe({ kind: 'run', runId: 'run-1' }) + + await expect(invokeRoute(service, runsCancelRoute.name, { runId: 'run-1' })).resolves.toEqual({ + runId: 'run-1', + cancelRequested: true, + status: 'idle' + }) + await expect(invokeRoute(service, runsCancelRoute.name, { runId: 'run-1' })).resolves.toEqual({ + runId: 'run-1', + cancelRequested: false, + status: 'idle' + }) + expect(turn.cancelGeneration).toHaveBeenCalledTimes(1) + await expect(nextEvent(events.events)).resolves.toMatchObject({ + event: 'runs.cancel.requested' + }) + }) + + it('emits a recovery snapshot and then terminates on a targeted completion event', async () => { + const { service, hub } = createHarness() + const emitted: Array<{ event: string; data: unknown; context: unknown }> = [] + let snapshotEmitted!: () => void + const snapshotReady = new Promise((resolve) => { + snapshotEmitted = resolve + }) + const controller = new AbortController() + const result = service.dispatchStream( + eventsSubscribeRoute.name, + { runId: 'run-1' }, + humanCaller, + controller.signal, + async (event, data, context) => { + emitted.push({ event, data, context }) + if (event === 'runs.snapshot') snapshotEmitted() + } + ) + await snapshotReady + + hub.publish( + 'chat.stream.completed', + { + requestId: 'request-1', + sessionId: 'run-1', + messageId: 'message-2', + completedAt: 300 + }, + { kind: 'run', runId: 'run-1' } + ) + + await expect(result).resolves.toEqual({ runId: 'run-1', lastCursor: 'test-epoch_1:1' }) + expect(emitted.map((entry) => entry.event)).toEqual(['runs.snapshot', 'chat.stream.completed']) + expect(emitted[0].context).toEqual({ runId: 'run-1', cursor: 'test-epoch_1:0' }) + }) + + it('does not terminate a root run watcher when a descendant session completes', async () => { + const { service, hub } = createHarness() + const emitted: string[] = [] + let snapshotEmitted!: () => void + const snapshotReady = new Promise((resolve) => { + snapshotEmitted = resolve + }) + const result = service.dispatchStream( + eventsSubscribeRoute.name, + { runId: 'run-1' }, + humanCaller, + new AbortController().signal, + async (event) => { + emitted.push(event) + if (event === 'runs.snapshot') snapshotEmitted() + } + ) + await snapshotReady + + hub.publish( + 'chat.stream.completed', + { + requestId: 'request-child', + sessionId: 'child-session', + messageId: 'message-child', + completedAt: 300 + }, + { kind: 'run', runId: 'run-1' } + ) + await vi.waitFor(() => expect(emitted).toContain('chat.stream.completed')) + let settled = false + void result.finally(() => { + settled = true + }) + await Promise.resolve() + expect(settled).toBe(false) + + hub.publish( + 'chat.stream.completed', + { + requestId: 'request-root', + sessionId: 'run-1', + messageId: 'message-root', + completedAt: 301 + }, + { kind: 'run', runId: 'run-1' } + ) + + await expect(result).resolves.toEqual({ runId: 'run-1', lastCursor: 'test-epoch_1:2' }) + expect(emitted).toEqual(['runs.snapshot', 'chat.stream.completed', 'chat.stream.completed']) + }) + + it('returns immediately after recovering an already-terminal run', async () => { + const idleSession = { ...baseSession, status: 'idle' as const } + const { service } = createHarness({ session: idleSession }) + const emit = vi.fn(async () => undefined) + + await expect( + service.dispatchStream( + eventsSubscribeRoute.name, + { runId: 'run-1' }, + humanCaller, + new AbortController().signal, + emit + ) + ).resolves.toEqual({ runId: 'run-1', lastCursor: 'test-epoch_1:0' }) + expect(emit).toHaveBeenCalledWith( + 'runs.snapshot', + expect.objectContaining({ recoveryReason: 'cursor_missing' }), + { runId: 'run-1', cursor: 'test-epoch_1:0' } + ) + }) + + it('disconnects a watcher without cancelling the detached run', async () => { + const { service, turn } = createHarness() + let snapshotEmitted!: () => void + const snapshotReady = new Promise((resolve) => { + snapshotEmitted = resolve + }) + const controller = new AbortController() + const result = service.dispatchStream( + eventsSubscribeRoute.name, + { runId: 'run-1' }, + humanCaller, + controller.signal, + async (event) => { + if (event === 'runs.snapshot') snapshotEmitted() + } + ) + await snapshotReady + controller.abort() + + await expect(result).resolves.toEqual({ runId: 'run-1', lastCursor: 'test-epoch_1:0' }) + expect(turn.cancelGeneration).not.toHaveBeenCalled() + }) + + it('rejects renderer callers before exposing run existence', async () => { + const { service } = createHarness() + + await expect( + invokeRoute( + service, + runsGetRoute.name, + { runId: 'run-1' }, + { + kind: 'renderer', + webContentsId: 1, + windowId: 1 + } + ) + ).rejects.toBeInstanceOf(CliRequestError) + }) +}) diff --git a/test/main/cli/server.test.ts b/test/main/cli/server.test.ts new file mode 100644 index 0000000000..03bbec94a1 --- /dev/null +++ b/test/main/cli/server.test.ts @@ -0,0 +1,965 @@ +import { createHash } from 'node:crypto' +import { request as httpRequest } from 'node:http' +import { mkdtemp, readFile, readdir, rm, stat } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { cliVersionRoute, type DeepchatRouteName } from '@shared/contracts/routes' +import type { JsonValue } from '@shared/contracts/json' +import { + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SCOPES, + LOCAL_CONTROL_SURFACE_VERSION, + LOCAL_CONTROL_METHOD_HEADER, + LOCAL_CONTROL_UPLOAD_REQUEST_HEADER, + LocalControlDescriptorSchema, + LocalControlRpcResponseSchema, + LocalControlUploadRequestSchema, + type LocalControlDescriptor, + type LocalControlRpcResponse, + type LocalControlScope, + type LocalControlUploadBinding +} from '@shared/contracts/localControl' +import { createCliRoutes } from '@/cli/routes' +import { CliServer, type CliServerDependencies, type CliUploadedInputFile } from '@/cli/server' +import { CliRequestError } from '@/cli/errors' +import { + AgentCliTokenAuthority, + type AgentCliRequestBeginResult, + type AgentCliTokenClaims +} from '@/cli/agentTokenAuthority' +import type { CliRequestAdmission, CliRequestPolicyInput } from '@/cli/policy' +import type { CliSurfaceEntry } from '@/cli/surface' +import type { CliRouteCaller } from '@/routes/routeRegistry' +import { invokeLocalControlStream } from '../../../src/cli/transport' + +type RpcResult = Readonly<{ + status: number + connection: string | undefined + body: LocalControlRpcResponse +}> + +function grantAgentRequest( + claims: AgentCliTokenClaims, + release: () => void = () => undefined +): AgentCliRequestBeginResult { + return { + status: 'granted', + grant: { + claims, + signal: new AbortController().signal, + consumeBytes: () => true, + release + } + } +} + +const servers: CliServer[] = [] +const temporaryDirectories: string[] = [] + +async function createTemporaryDirectory(): Promise { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-server-')) + temporaryDirectories.push(directory) + return directory +} + +function rpcRequest( + descriptor: LocalControlDescriptor, + input: { + token?: string + id?: string + method?: string + params?: unknown + protocolVersion?: number + surfaceVersion?: number + }, + options: { + includeContentLength?: boolean + methodHeader?: string | null + sendBody?: boolean + } = {} +): Promise { + const serialized = Buffer.from( + JSON.stringify({ + protocolVersion: input.protocolVersion ?? LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: input.surfaceVersion ?? LOCAL_CONTROL_SURFACE_VERSION, + id: input.id ?? 'request-1', + method: input.method ?? 'cli.version', + params: input.params ?? {} + }) + ) + const headers: Record = { + authorization: `Bearer ${input.token ?? descriptor.token}`, + 'content-type': 'application/json' + } + const methodHeader = + options.methodHeader === undefined ? (input.method ?? 'cli.version') : options.methodHeader + if (methodHeader !== null) headers[LOCAL_CONTROL_METHOD_HEADER] = methodHeader + if (options.includeContentLength !== false) headers['content-length'] = serialized.length + + return new Promise((resolve, reject) => { + const request = httpRequest( + { + socketPath: + descriptor.endpoint.kind === 'unix' ? descriptor.endpoint.path : descriptor.endpoint.name, + path: '/v1/rpc', + method: 'POST', + headers + }, + (response) => { + const chunks: Buffer[] = [] + response.on('data', (chunk: Buffer) => chunks.push(chunk)) + response.once('error', reject) + response.once('end', () => { + try { + resolve({ + status: response.statusCode ?? 0, + connection: + typeof response.headers.connection === 'string' + ? response.headers.connection + : undefined, + body: LocalControlRpcResponseSchema.parse( + JSON.parse(Buffer.concat(chunks).toString('utf8')) + ) + }) + } catch (error) { + reject(error) + } + }) + } + ) + request.once('error', reject) + if (options.sendBody === false) { + request.flushHeaders() + } else if (options.includeContentLength === false) { + const midpoint = Math.max(1, Math.floor(serialized.length / 2)) + request.write(serialized.subarray(0, midpoint)) + request.end(serialized.subarray(midpoint)) + } else { + request.end(serialized) + } + }) +} + +function uploadRequest( + descriptor: LocalControlDescriptor, + input: { + token?: string + body: Buffer + includeContentLength?: boolean + signal?: AbortSignal + binding?: LocalControlUploadBinding + expectContinue?: boolean + onContinue?: () => void + } +): Promise { + const envelope = Buffer.from( + JSON.stringify( + LocalControlUploadRequestSchema.parse({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + id: 'request-upload', + method: cliVersionRoute.name, + params: {}, + upload: input.binding ?? { + size: input.body.length, + sha256: createHash('sha256').update(input.body).digest('hex') + } + }) + ) + ).toString('base64url') + const headers: Record = { + authorization: `Bearer ${input.token ?? descriptor.token}`, + 'content-type': 'application/octet-stream', + [LOCAL_CONTROL_UPLOAD_REQUEST_HEADER]: envelope + } + const expectsContinue = input.expectContinue !== false + if (input.includeContentLength !== false) headers['content-length'] = input.body.length + if (expectsContinue) headers.expect = '100-continue' + + return new Promise((resolve, reject) => { + let responseReceived = false + const request = httpRequest( + { + socketPath: + descriptor.endpoint.kind === 'unix' ? descriptor.endpoint.path : descriptor.endpoint.name, + path: '/v1/upload', + method: 'POST', + signal: input.signal, + headers + }, + (response) => { + responseReceived = true + const chunks: Buffer[] = [] + response.on('data', (chunk: Buffer) => chunks.push(chunk)) + response.once('error', reject) + response.once('end', () => { + try { + resolve({ + status: response.statusCode ?? 0, + connection: + typeof response.headers.connection === 'string' + ? response.headers.connection + : undefined, + body: LocalControlRpcResponseSchema.parse( + JSON.parse(Buffer.concat(chunks).toString('utf8')) + ) + }) + } catch (error) { + reject(error) + } + }) + } + ) + request.once('error', (error) => { + if (!responseReceived) reject(error) + }) + const sendBody = () => { + if (input.includeContentLength === false) { + const midpoint = Math.max(1, Math.floor(input.body.length / 2)) + request.write(input.body.subarray(0, midpoint)) + request.end(input.body.subarray(midpoint)) + } else { + request.end(input.body) + } + } + if (expectsContinue) { + request.once('continue', () => { + input.onContinue?.() + sendBody() + }) + request.flushHeaders() + } else sendBody() + }) +} + +function createUploadSurface(maxBodyBytes: number): ReadonlyMap { + return new Map([ + [ + cliVersionRoute.name, + { + contract: cliVersionRoute, + effect: 'compute', + callers: ['human'], + scopes: ['system:read'], + transport: 'upload', + approval: 'never', + limits: { maxBodyBytes, timeoutMs: 5_000 } + } satisfies CliSurfaceEntry + ] + ]) +} + +async function createTestServer( + options: { + beginAgentRequest?: (token: string) => AgentCliRequestBeginResult + dispatchOutput?: (method: string) => unknown + streamOutput?: Readonly<{ + events: readonly JsonValue[] + contexts?: readonly (Readonly<{ runId?: string; cursor?: string }> | undefined)[] + result: unknown + }> + dispatchStream?: NonNullable + surface?: ReadonlyMap + dispatchUpload?: ( + method: string, + input: unknown, + upload: CliUploadedInputFile, + caller: CliRouteCaller, + signal: AbortSignal + ) => Promise + authorize?: (input: CliRequestPolicyInput) => Promise + } = {} +): Promise<{ + userDataPath: string + server: CliServer + descriptor: LocalControlDescriptor + dispatch: ReturnType + dispatchUpload: ReturnType + authorize: ReturnType +}> { + const userDataPath = await createTemporaryDirectory() + let server: CliServer + const routes = createCliRoutes({ + appVersion: '1.2.3', + getStatus: () => server.getStatus(), + hasTrustedRenderer: () => true + }) + const dispatch = vi.fn( + async (method: string, input: unknown, caller: CliRouteCaller): Promise => { + if (options.dispatchOutput) return options.dispatchOutput(method) + const route = routes.get(method as DeepchatRouteName) + if (!route) throw new Error(`Unknown test route: ${method}`) + return await route(input, { caller }) + } + ) + const dispatchUpload = vi.fn(options.dispatchUpload ?? (async () => ({}))) + const authorize = vi.fn(options.authorize ?? (async () => ({ release: () => undefined }))) + server = new CliServer({ + userDataPath, + appVersion: '1.2.3', + dispatch, + ...(options.dispatchStream + ? { dispatchStream: options.dispatchStream } + : options.streamOutput + ? { + dispatchStream: async ( + method: string, + _input: unknown, + _caller: CliRouteCaller, + _requestId: string, + _signal: AbortSignal, + emit: ( + event: string, + data: JsonValue, + context?: Readonly<{ runId?: string; cursor?: string }> + ) => Promise + ) => { + for (const [index, event] of (options.streamOutput?.events ?? []).entries()) { + await emit(method, event, options.streamOutput?.contexts?.[index]) + } + return options.streamOutput?.result + } + } + : {}), + beginAgentRequest: options.beginAgentRequest, + dispatchUpload, + ...(options.authorize ? { authorize } : {}), + surface: options.surface, + log: { warn: vi.fn(), error: vi.fn() } + }) + servers.push(server) + const descriptor = await server.start() + return { userDataPath, server, descriptor, dispatch, dispatchUpload, authorize } +} + +afterEach(async () => { + await Promise.all(servers.splice(0).map((server) => server.stop())) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('CLI local transport', () => { + it('serializes a stop that races with startup', async () => { + const userDataPath = await createTemporaryDirectory() + const server = new CliServer({ + userDataPath, + appVersion: '1.2.3', + dispatch: async () => ({}) + }) + servers.push(server) + + const starting = server.start() + const stopping = server.stop() + await Promise.all([starting, stopping]) + + expect(server.getStatus().running).toBe(false) + await expect(stat(server.getDescriptorPath())).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('discovers, authenticates, dispatches, and cleans up the server', async () => { + const { server, descriptor, dispatch } = await createTestServer() + const descriptorPath = server.getDescriptorPath() + + expect( + LocalControlDescriptorSchema.parse(JSON.parse(await readFile(descriptorPath, 'utf8'))) + ).toEqual(descriptor) + + const response = await rpcRequest(descriptor, {}) + expect(response).toMatchObject({ + status: 200, + body: { + ok: true, + result: { + appVersion: '1.2.3', + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + } + } + }) + expect(dispatch).toHaveBeenCalledOnce() + expect(dispatch.mock.calls[0]?.[2]).toMatchObject({ + kind: 'cli', + principal: 'human', + scopes: LOCAL_CONTROL_SCOPES + }) + + await server.stop() + await expect(stat(descriptorPath)).rejects.toMatchObject({ code: 'ENOENT' }) + if (descriptor.endpoint.kind === 'unix') { + await expect(stat(descriptor.endpoint.path)).rejects.toMatchObject({ code: 'ENOENT' }) + } + }) + + it('terminates active CLI streams when the desktop server stops', async () => { + const dispatchStream = vi.fn(async () => await new Promise(() => undefined)) + const { server, descriptor } = await createTestServer({ dispatchStream }) + const response = invokeLocalControlStream( + { + descriptor, + token: descriptor.token, + id: 'request-stream-shutdown', + method: 'models.invoke', + params: { + providerId: 'provider-1', + modelId: 'model-1', + messages: [{ role: 'user', content: 'wait' }] + }, + signal: new AbortController().signal + }, + async () => undefined + ) + await vi.waitFor(() => expect(dispatchStream).toHaveBeenCalledOnce()) + + await server.stop() + + await expect(response).resolves.toMatchObject({ + ok: false, + error: { code: 'unavailable', retriable: true } + }) + expect(server.getStatus()).toMatchObject({ + running: false, + activeConnections: 0, + pendingRequests: 0, + descriptorReady: false + }) + }) + + it('fails closed on invalid authentication without dispatching', async () => { + const { descriptor, dispatch } = await createTestServer() + + const response = await rpcRequest(descriptor, { token: 'x'.repeat(43) }) + + expect(response).toMatchObject({ + status: 401, + connection: 'close', + body: { ok: false, error: { code: 'authentication_failed' } } + }) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('enforces protocol versions and the explicit surface before dispatch', async () => { + const { descriptor, dispatch } = await createTestServer() + + const incompatible = await rpcRequest(descriptor, { protocolVersion: 2 }) + const hidden = await rpcRequest(descriptor, { method: 'settings.getSnapshot' }) + + expect(incompatible).toMatchObject({ + status: 409, + body: { ok: false, error: { code: 'unsupported_version' } } + }) + expect(hidden).toMatchObject({ + status: 404, + body: { ok: false, error: { code: 'not_found' } } + }) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('requires the method header to match the typed request body', async () => { + const { descriptor, dispatch } = await createTestServer() + + const missing = await rpcRequest(descriptor, {}, { methodHeader: null }) + const mismatched = await rpcRequest( + descriptor, + { method: 'cli.version' }, + { methodHeader: 'providers.listPublic' } + ) + + expect(missing).toMatchObject({ + status: 400, + body: { ok: false, error: { code: 'invalid_request' } } + }) + expect(mismatched).toMatchObject({ + status: 400, + body: { ok: false, error: { code: 'invalid_request' } } + }) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('rejects a declared JSON body against its route limit before reading it', async () => { + const { descriptor, dispatch } = await createTestServer() + + const response = await rpcRequest( + descriptor, + { params: { padding: 'x'.repeat(20 * 1024) } }, + { sendBody: false } + ) + + expect(response).toMatchObject({ + status: 413, + body: { ok: false, error: { code: 'body_too_large' } } + }) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('reports invalid route output as an internal contract failure', async () => { + const { descriptor } = await createTestServer({ + dispatchOutput: () => ({ appVersion: '' }) + }) + + const response = await rpcRequest(descriptor, {}) + + expect(response).toMatchObject({ + status: 500, + body: { ok: false, error: { code: 'internal_error' } } + }) + }) + + it('releases policy admission after a route contract failure', async () => { + const release = vi.fn() + const { descriptor, authorize } = await createTestServer({ + authorize: async () => ({ release }), + dispatchOutput: () => ({ appVersion: '' }) + }) + + const response = await rpcRequest(descriptor, {}) + + expect(response).toMatchObject({ + status: 500, + body: { ok: false, error: { code: 'internal_error' } } + }) + expect(authorize).toHaveBeenCalledOnce() + expect(release).toHaveBeenCalledOnce() + }) + + it('requires Content-Length and never accepts implicit chunked RPC input', async () => { + const { descriptor, dispatch } = await createTestServer() + + const response = await rpcRequest(descriptor, {}, { includeContentLength: false }) + + expect(response).toMatchObject({ + status: 411, + body: { ok: false, error: { code: 'invalid_request' } } + }) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('validates upload policy before spilling and cleans the private input file', async () => { + let uploadedPath = '' + let uploadedBytes = Buffer.alloc(0) + const { descriptor, userDataPath, dispatchUpload, authorize } = await createTestServer({ + surface: createUploadSurface(16), + authorize: async () => ({ release: () => undefined }), + dispatchUpload: async (_method, _input, upload) => { + uploadedPath = upload.path + uploadedBytes = await readFile(upload.path) + return { + appVersion: '1.2.3', + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + } + } + }) + + const response = await uploadRequest(descriptor, { body: Buffer.from('audio-input') }) + + expect(response).toMatchObject({ status: 200, body: { ok: true } }) + expect(uploadedBytes).toEqual(Buffer.from('audio-input')) + expect(dispatchUpload).toHaveBeenCalledOnce() + expect(authorize).toHaveBeenCalledWith( + expect.objectContaining({ + transportBinding: { + size: 11, + sha256: createHash('sha256').update('audio-input').digest('hex') + } + }) + ) + await expect(stat(uploadedPath)).rejects.toMatchObject({ code: 'ENOENT' }) + expect(await readdir(path.join(userDataPath, 'local-control', 'tmp'))).toEqual([]) + }) + + it('waits for upload approval before accepting file bytes', async () => { + let resolveApproval!: (admission: CliRequestAdmission) => void + const approval = new Promise((resolve) => { + resolveApproval = resolve + }) + let continued = false + const { descriptor, userDataPath, dispatchUpload, authorize } = await createTestServer({ + surface: createUploadSurface(16), + authorize: async () => await approval, + dispatchUpload: async () => ({ + appVersion: '1.2.3', + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION + }) + }) + + const response = uploadRequest(descriptor, { + body: Buffer.from('audio-input'), + onContinue: () => { + continued = true + } + }) + await vi.waitFor(() => expect(authorize).toHaveBeenCalledOnce()) + + expect(continued).toBe(false) + expect(dispatchUpload).not.toHaveBeenCalled() + expect(await readdir(path.join(userDataPath, 'local-control', 'tmp'))).toEqual([]) + + resolveApproval({ release: () => undefined }) + + await expect(response).resolves.toMatchObject({ status: 200, body: { ok: true } }) + expect(continued).toBe(true) + expect(dispatchUpload).toHaveBeenCalledOnce() + }) + + it('rejects an upload without accepting file bytes when approval fails', async () => { + let rejectApproval!: (reason: unknown) => void + const approval = new Promise((_resolve, reject) => { + rejectApproval = reject + }) + let continued = false + const { descriptor, userDataPath, dispatchUpload, authorize } = await createTestServer({ + surface: createUploadSurface(16), + authorize: async () => await approval + }) + + const response = uploadRequest(descriptor, { + body: Buffer.from('audio-input'), + onContinue: () => { + continued = true + } + }) + await vi.waitFor(() => expect(authorize).toHaveBeenCalledOnce()) + rejectApproval( + new CliRequestError('approval_denied', 'Approval was denied', { + httpStatus: 403 + }) + ) + + await expect(response).resolves.toMatchObject({ + status: 403, + body: { ok: false, error: { code: 'approval_denied' } } + }) + expect(continued).toBe(false) + expect(dispatchUpload).not.toHaveBeenCalled() + expect(await readdir(path.join(userDataPath, 'local-control', 'tmp'))).toEqual([]) + }) + + it('rejects upload bytes that do not match the approved size or digest', async () => { + const { descriptor, dispatchUpload, authorize } = await createTestServer({ + surface: createUploadSurface(16), + authorize: async () => ({ release: () => undefined }) + }) + const body = Buffer.from('audio-input') + + const wrongSize = await uploadRequest(descriptor, { + body, + binding: { + size: 10, + sha256: createHash('sha256').update(body).digest('hex') + } + }) + const wrongDigest = await uploadRequest(descriptor, { + body, + binding: { + size: 11, + sha256: createHash('sha256').update('other-bytes').digest('hex') + } + }) + + expect(wrongSize).toMatchObject({ + status: 400, + body: { ok: false, error: { code: 'invalid_request' } } + }) + expect(wrongDigest).toMatchObject({ + status: 400, + body: { ok: false, error: { code: 'invalid_request' } } + }) + expect(authorize).toHaveBeenCalledOnce() + expect(dispatchUpload).not.toHaveBeenCalled() + }) + + it('bounds chunked uploads cumulatively and removes partial spill files', async () => { + const { descriptor, userDataPath, dispatchUpload } = await createTestServer({ + surface: createUploadSurface(8) + }) + + const response = await uploadRequest(descriptor, { + body: Buffer.from('123456789'), + includeContentLength: false + }) + + expect(response).toMatchObject({ + status: 413, + body: { ok: false, error: { code: 'body_too_large' } } + }) + expect(dispatchUpload).not.toHaveBeenCalled() + expect(await readdir(path.join(userDataPath, 'local-control', 'tmp'))).toEqual([]) + }) + + it('releases cancelled upload requests when a domain adapter ignores the signal', async () => { + const controller = new AbortController() + const { descriptor, userDataPath, server, dispatchUpload } = await createTestServer({ + surface: createUploadSurface(16), + dispatchUpload: async () => await new Promise(() => undefined) + }) + + const response = uploadRequest(descriptor, { + body: Buffer.from('audio-input'), + signal: controller.signal + }) + await vi.waitFor(() => expect(dispatchUpload).toHaveBeenCalledOnce()) + controller.abort() + + await expect(response).rejects.toBeDefined() + await vi.waitFor(() => expect(server.getStatus().pendingRequests).toBe(0)) + expect(await readdir(path.join(userDataPath, 'local-control', 'tmp'))).toEqual([]) + }) + + it('denies Agent upload callers before reading their body', async () => { + const agentToken = 'a'.repeat(43) + const { descriptor, userDataPath, dispatchUpload } = await createTestServer({ + surface: createUploadSurface(16), + beginAgentRequest: (token) => + token === agentToken + ? grantAgentRequest({ + tokenId: 'token-id-conversation-1', + conversationId: 'conversation-1', + expiresAt: Date.now() + 60_000, + scopes: ['system:read'] + }) + : { status: 'invalid' } + }) + + const response = await uploadRequest(descriptor, { + token: agentToken, + body: Buffer.from('audio-input') + }) + + expect(response).toMatchObject({ + status: 403, + body: { ok: false, error: { code: 'permission_denied' } } + }) + expect(dispatchUpload).not.toHaveBeenCalled() + expect(await readdir(path.join(userDataPath, 'local-control', 'tmp'))).toEqual([]) + }) + + it('rejects request bodies on artifact download endpoints', async () => { + const { descriptor } = await createTestServer() + const body = await new Promise((resolve, reject) => { + const request = httpRequest( + { + socketPath: + descriptor.endpoint.kind === 'unix' + ? descriptor.endpoint.path + : descriptor.endpoint.name, + path: '/v1/artifacts/abcdefghijklmnop', + method: 'GET', + headers: { + authorization: `Bearer ${descriptor.token}`, + 'content-length': 1 + } + }, + (response) => { + const chunks: Buffer[] = [] + response.on('data', (chunk: Buffer) => chunks.push(chunk)) + response.once('error', reject) + response.once('end', () => { + try { + resolve( + LocalControlRpcResponseSchema.parse( + JSON.parse(Buffer.concat(chunks).toString('utf8')) + ) + ) + } catch (error) { + reject(error) + } + }) + } + ) + request.once('error', reject) + request.end('x') + }) + + expect(body).toMatchObject({ ok: false, error: { code: 'invalid_request' } }) + }) + + it('applies agent expiry and scopes independently of the bearer token', async () => { + let scopes: readonly LocalControlScope[] = ['models:read'] + let expiresAt = Date.now() - 1 + const release = vi.fn() + const agentToken = 'g'.repeat(43) + const { descriptor, dispatch } = await createTestServer({ + beginAgentRequest: (token) => + token === agentToken + ? grantAgentRequest( + { + tokenId: 'token-id-conversation-1', + conversationId: 'conversation-1', + expiresAt, + scopes + }, + release + ) + : { status: 'invalid' } + }) + + const expired = await rpcRequest(descriptor, { token: agentToken }) + expiresAt = Date.now() + 60_000 + const denied = await rpcRequest(descriptor, { token: agentToken }) + scopes = ['system:read'] + const allowed = await rpcRequest(descriptor, { token: agentToken }) + + expect(expired).toMatchObject({ + status: 401, + body: { ok: false, error: { code: 'authentication_failed' } } + }) + expect(denied).toMatchObject({ + status: 403, + body: { ok: false, error: { code: 'permission_denied' } } + }) + expect(allowed).toMatchObject({ status: 200, body: { ok: true } }) + expect(release).toHaveBeenCalledTimes(3) + expect(dispatch).toHaveBeenCalledOnce() + expect(dispatch.mock.calls[0]?.[2]).toMatchObject({ + kind: 'cli', + principal: 'agent', + tokenId: 'token-id-conversation-1', + conversationId: 'conversation-1', + scopes: ['system:read'] + }) + }) + + it('enforces Agent token call quotas before dispatch', async () => { + const agentToken = 'h'.repeat(43) + const authority = new AgentCliTokenAuthority({ + createToken: () => agentToken, + createTokenId: () => 'token-id-conversation-1' + }) + authority.issue({ + conversationId: 'conversation-1', + scopes: ['system:read'], + maxCalls: 1, + maxBytes: 16 * 1024 + }) + const { descriptor, dispatch } = await createTestServer({ + beginAgentRequest: (token) => authority.beginRequest(token) + }) + + const allowed = await rpcRequest(descriptor, { token: agentToken }) + const exhausted = await rpcRequest(descriptor, { token: agentToken }) + + expect(allowed).toMatchObject({ status: 200, body: { ok: true } }) + expect(exhausted).toMatchObject({ + status: 429, + body: { ok: false, error: { code: 'rate_limited' } } + }) + expect(dispatch).toHaveBeenCalledOnce() + }) + + it('stops reading when an Agent token byte quota is exhausted', async () => { + const agentToken = 'i'.repeat(43) + const authority = new AgentCliTokenAuthority({ + createToken: () => agentToken, + createTokenId: () => 'token-id-conversation-1' + }) + authority.issue({ + conversationId: 'conversation-1', + scopes: ['system:read'], + maxCalls: 2, + maxBytes: 1 + }) + const { descriptor, dispatch } = await createTestServer({ + beginAgentRequest: (token) => authority.beginRequest(token) + }) + + const exhausted = await rpcRequest(descriptor, { token: agentToken }) + + expect(exhausted).toMatchObject({ + status: 429, + body: { ok: false, error: { code: 'rate_limited' } } + }) + expect(dispatch).not.toHaveBeenCalled() + }) + + it('cancels an active Agent request when its conversation token is revoked', async () => { + const agentToken = 'j'.repeat(43) + const authority = new AgentCliTokenAuthority({ + createToken: () => agentToken, + createTokenId: () => 'token-id-conversation-1' + }) + authority.issue({ + conversationId: 'conversation-1', + scopes: ['system:read'], + maxBytes: 16 * 1024 + }) + const { descriptor, dispatch } = await createTestServer({ + beginAgentRequest: (token) => authority.beginRequest(token), + dispatchOutput: () => new Promise(() => undefined) + }) + + const response = rpcRequest(descriptor, { token: agentToken }) + await vi.waitFor(() => expect(dispatch).toHaveBeenCalledOnce()) + authority.revokeConversation('conversation-1') + + await expect(response).resolves.toMatchObject({ + status: 401, + body: { ok: false, error: { code: 'authentication_failed' } } + }) + }) + + it('streams typed events and one terminal route result', async () => { + const { server, descriptor } = await createTestServer({ + streamOutput: { + events: [ + { type: 'text_delta', text: 'hello' }, + { type: 'stop', reason: 'complete' } + ], + contexts: [ + { runId: 'run-1', cursor: 'epoch-1:1' }, + { runId: 'run-1', cursor: 'epoch-1:2' } + ], + result: { + providerId: 'provider-1', + modelId: 'model-1', + text: 'hello', + finishReason: 'complete', + latency: { queueMs: 0, firstEventMs: 1, firstTextMs: 1, totalMs: 10 } + } + } + }) + const events: Array<{ + data: JsonValue + runId?: string + cursor?: string + }> = [] + + const result = await invokeLocalControlStream( + { + descriptor, + token: descriptor.token, + id: 'request-stream-1', + method: 'models.invoke', + params: { + providerId: 'provider-1', + modelId: 'model-1', + messages: [{ role: 'user', content: 'hello' }] + }, + signal: new AbortController().signal + }, + async (event) => + events.push({ + data: event.data, + ...(event.runId ? { runId: event.runId } : {}), + ...(event.cursor ? { cursor: event.cursor } : {}) + }) + ) + + expect(events).toEqual([ + { + data: { type: 'text_delta', text: 'hello' }, + runId: 'run-1', + cursor: 'epoch-1:1' + }, + { + data: { type: 'stop', reason: 'complete' }, + runId: 'run-1', + cursor: 'epoch-1:2' + } + ]) + expect(result).toMatchObject({ ok: true, result: { text: 'hello' } }) + expect(server.getStatus().pendingRequests).toBe(0) + }) +}) diff --git a/test/main/cli/skillService.test.ts b/test/main/cli/skillService.test.ts new file mode 100644 index 0000000000..7971a72ef1 --- /dev/null +++ b/test/main/cli/skillService.test.ts @@ -0,0 +1,359 @@ +import { access, mkdtemp, readFile, rm, unlink, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { describe, expect, it, vi } from 'vitest' +import { + skillsInstallPublicUrlRoute, + skillsInstallUploadRoute, + skillsListPublicRoute, + skillsSetPublicStatusRoute, + skillsUninstallPublicRoute +} from '@shared/contracts/routes' +import type { SkillServicePort } from '@shared/types/skill' +import type { UnifiedSkillItem } from '@shared/types/skillManagement' +import { CliSkillService, retainUploadFile } from '@/cli/skillService' +import type { CliRouteCaller, RouteContext } from '@/routes/routeRegistry' + +const caller: CliRouteCaller = { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['skills:read', 'skills:write'] +} + +function skill(overrides: Partial = {}): UnifiedSkillItem { + return { + agentId: 'deepchat', + name: 'safe-skill', + description: 'Safe\n\u001b[31m description', + path: '/Users/private/.deepchat/skills/safe-skill/SKILL.md', + skillRoot: '/Users/private/.deepchat/skills/safe-skill', + category: 'development', + platforms: ['linux', 'linux', '\u001b[2JmacOS'], + metadata: { token: 'metadata-secret' }, + allowedTools: ['read', 'bash'], + ownerPluginId: 'private-plugin-id', + canonicalPath: '/Users/private/.deepchat/skills/safe-skill', + sourceType: 'zip-install', + disabled: false, + deepchatDisabled: false, + agentLinks: { + codex: { + path: '/Users/private/.codex/skills/safe-skill', + state: 'linked', + createdByDeepChat: true + } + }, + mutable: false, + ...overrides + } +} + +function createHarness(catalog: UnifiedSkillItem[] = [skill()]) { + const getUnifiedSkillCatalog = vi.fn(async () => catalog) + const installFromUrlForAgent = vi.fn(async () => ({ + success: true, + skillName: 'installed-skill', + targetPath: '/private/install/path' + })) + const installFromZipForAgent = vi.fn(async () => ({ + success: true, + skillName: 'uploaded-skill', + targetPath: '/private/upload/path' + })) + const setSkillDisabledForAgent = vi.fn(async () => undefined) + const uninstallSkillForAgent = vi.fn(async () => ({ + success: true, + skillName: 'safe-skill' + })) + const recordSettingsActivity = vi.fn() + const service = new CliSkillService({ + skills: { + getUnifiedSkillCatalog, + installFromUrlForAgent, + installFromZipForAgent, + setSkillDisabledForAgent, + uninstallSkillForAgent + } as Pick< + SkillServicePort, + | 'getUnifiedSkillCatalog' + | 'installFromUrlForAgent' + | 'installFromZipForAgent' + | 'setSkillDisabledForAgent' + | 'uninstallSkillForAgent' + >, + agentExists: async (agentId) => agentId === 'agent-1', + recordSettingsActivity, + log: { warn: vi.fn() } + }) + const routes = service.createRoutes() + const invoke = async (method: string, input: unknown, context: RouteContext = { caller }) => { + const route = routes.get(method as never) + if (!route) throw new Error(`Missing route: ${method}`) + return await route(input, context) + } + return { + service, + getUnifiedSkillCatalog, + installFromUrlForAgent, + installFromZipForAgent, + setSkillDisabledForAgent, + uninstallSkillForAgent, + recordSettingsActivity, + invoke + } +} + +describe('CLI Skill service', () => { + it('retains uploads on filesystems without hardlink support', async () => { + const tempDirectory = await mkdtemp(path.join(tmpdir(), 'deepchat-cli-skill-retain-')) + const uploadPath = path.join(tempDirectory, 'body-upload.tmp') + await writeFile(uploadPath, 'archive-bytes') + + try { + const retained = await retainUploadFile(uploadPath, async () => { + throw Object.assign(new Error('hardlinks are unavailable'), { code: 'EPERM' }) + }) + expect(retained.path).not.toBe(uploadPath) + await expect(readFile(retained.path, 'utf8')).resolves.toBe('archive-bytes') + } finally { + await rm(tempDirectory, { recursive: true, force: true }) + } + }) + + it('accepts signed HTTPS URLs but rejects credentials, fragments, and unsafe filenames', () => { + expect( + skillsInstallPublicUrlRoute.input.safeParse({ + url: 'https://skills.example/archive.zip?signature=private' + }).success + ).toBe(true) + for (const url of [ + 'http://skills.example/archive.zip', + 'https://user:secret@skills.example/archive.zip', + 'https://skills.example/archive.zip#fragment' + ]) { + expect(skillsInstallPublicUrlRoute.input.safeParse({ url }).success).toBe(false) + } + expect( + skillsInstallUploadRoute.input.safeParse({ filename: 'unsafe\u001b[31m.zip' }).success + ).toBe(false) + }) + + it('returns bounded public metadata without filesystem or plugin internals', async () => { + const harness = createHarness() + + const result = await harness.invoke(skillsListPublicRoute.name, {}) + + expect(result).toEqual({ + skills: [ + { + agentId: 'deepchat', + name: 'safe-skill', + description: 'Safe [31m description', + category: 'development', + platforms: ['[2JmacOS', 'linux'], + allowedTools: ['bash', 'read'], + sourceType: 'zip-install', + enabled: true, + mutable: false, + managedBy: 'plugin', + metadataTruncated: false + } + ], + truncated: false + }) + const serialized = JSON.stringify(result) + expect(serialized).not.toContain('/Users/private') + expect(serialized).not.toContain('private-plugin-id') + expect(serialized).not.toContain('metadata-secret') + }) + + it('byte-bounds untrusted metadata and reports truncation', async () => { + const harness = createHarness([ + skill({ + description: '界'.repeat(1_000), + allowedTools: Array.from({ length: 10_000 }, (_, index) => `tool-${index}`) + }) + ]) + + const result = (await harness.invoke(skillsListPublicRoute.name, {})) as { + skills: Array<{ description: string; allowedTools: string[]; metadataTruncated: boolean }> + } + + expect(Buffer.byteLength(result.skills[0].description, 'utf8')).toBeLessThanOrEqual(1024) + expect(result.skills[0].allowedTools).toHaveLength(32) + expect(result.skills[0].metadataTruncated).toBe(true) + }) + + it('bounds scanning of metadata that sanitizes to empty text', async () => { + const harness = createHarness([ + skill({ description: `${'\u0000'.repeat(100_000)}unreachable-tail` }) + ]) + + const result = (await harness.invoke(skillsListPublicRoute.name, {})) as { + skills: Array<{ description: string; metadataTruncated: boolean }> + } + + expect(result.skills[0]).toMatchObject({ description: '', metadataTruncated: true }) + }) + + it('installs HTTPS URLs while returning only a stable public result', async () => { + const harness = createHarness() + const url = 'https://skills.example/archive.zip?signature=private' + + const result = await harness.invoke(skillsInstallPublicUrlRoute.name, { + url, + overwrite: true + }) + + expect(result).toEqual({ + agentId: 'deepchat', + name: 'installed-skill', + installed: true + }) + expect(harness.installFromUrlForAgent).toHaveBeenCalledWith('deepchat', url, { + overwrite: true + }) + expect(JSON.stringify(result)).not.toContain('private') + expect(harness.recordSettingsActivity).toHaveBeenCalledOnce() + }) + + it('maps raw installer failures to stable errors without leaking paths', async () => { + const harness = createHarness() + harness.installFromUrlForAgent.mockResolvedValueOnce({ + success: false, + errorCode: 'io_error', + error: 'EACCES /Users/private/secret-path' + }) + + const failure = await harness + .invoke(skillsInstallPublicUrlRoute.name, { + url: 'https://skills.example/archive.zip' + }) + .catch((error: unknown) => error) + + expect(failure).toMatchObject({ + code: 'unavailable', + message: 'Skill installation failed' + }) + expect(String((failure as Error).message)).not.toContain('/Users/private') + }) + + it('retains an approved upload until installation settles', async () => { + const harness = createHarness() + const signal = new AbortController().signal + const tempDirectory = await mkdtemp(path.join(tmpdir(), 'deepchat-cli-skill-')) + const uploadPath = path.join(tempDirectory, 'body-upload.tmp') + await writeFile(uploadPath, 'archive-bytes') + let retainedPath = '' + let releaseInstall!: () => void + const installReleased = new Promise((resolve) => { + releaseInstall = resolve + }) + const installStarted = new Promise((resolve) => { + harness.installFromZipForAgent.mockImplementationOnce(async (_agentId, zipPath) => { + retainedPath = zipPath + resolve() + await installReleased + return { success: true, skillName: 'uploaded-skill' } + }) + }) + + try { + const operation = harness.service.dispatchUpload( + skillsInstallUploadRoute.name, + { filename: 'skill.zip', overwrite: false }, + { path: uploadPath, size: 13 }, + caller, + signal + ) + await installStarted + expect(retainedPath).not.toBe(uploadPath) + await unlink(uploadPath) + await expect(readFile(retainedPath, 'utf8')).resolves.toBe('archive-bytes') + releaseInstall() + + await expect(operation).resolves.toEqual({ + agentId: 'deepchat', + name: 'uploaded-skill', + installed: true + }) + await expect(access(retainedPath)).rejects.toMatchObject({ code: 'ENOENT' }) + } finally { + releaseInstall() + await rm(tempDirectory, { recursive: true, force: true }) + } + }) + + it('allows policy-authorized Agent URL installs but rejects upload and execution mutations', async () => { + const harness = createHarness() + const agentCaller: CliRouteCaller = { + ...caller, + principal: 'agent', + tokenId: 'token-id-conversation-1', + conversationId: 'conversation-1', + expiresAt: Date.now() + 60_000 + } + + await expect( + harness.invoke( + skillsInstallPublicUrlRoute.name, + { url: 'https://skills.example/archive.zip' }, + { caller: agentCaller } + ) + ).resolves.toMatchObject({ name: 'installed-skill', installed: true }) + await expect( + harness.invoke( + skillsSetPublicStatusRoute.name, + { name: 'safe-skill', enabled: false }, + { caller: agentCaller } + ) + ).rejects.toMatchObject({ code: 'permission_denied' }) + await expect( + harness.service.dispatchUpload( + skillsInstallUploadRoute.name, + { filename: 'skill.zip' }, + { path: '/unused/body.tmp', size: 42 }, + agentCaller, + new AbortController().signal + ) + ).rejects.toMatchObject({ code: 'permission_denied' }) + }) + + it('updates status and refuses removal of externally managed Skills', async () => { + const mutableSkill = skill({ ownerPluginId: undefined, mutable: true }) + const harness = createHarness([mutableSkill]) + + await expect( + harness.invoke(skillsSetPublicStatusRoute.name, { + name: 'safe-skill', + enabled: false + }) + ).resolves.toEqual({ agentId: 'deepchat', name: 'safe-skill', enabled: false }) + expect(harness.setSkillDisabledForAgent).toHaveBeenCalledWith('deepchat', 'safe-skill', true) + await expect( + harness.invoke(skillsUninstallPublicRoute.name, { name: 'safe-skill' }) + ).resolves.toEqual({ agentId: 'deepchat', name: 'safe-skill', removed: true }) + + const managed = createHarness() + await expect( + managed.invoke(skillsUninstallPublicRoute.name, { name: 'safe-skill' }) + ).rejects.toMatchObject({ code: 'conflict' }) + expect(managed.uninstallSkillForAgent).not.toHaveBeenCalled() + }) + + it('rejects renderer callers and missing Agent scopes', async () => { + const harness = createHarness() + + await expect( + harness.invoke( + skillsListPublicRoute.name, + {}, + { caller: { kind: 'renderer', webContentsId: 1, windowId: 1 } } + ) + ).rejects.toMatchObject({ code: 'permission_denied' }) + await expect( + harness.invoke(skillsListPublicRoute.name, { agentId: 'missing-agent' }) + ).rejects.toMatchObject({ code: 'not_found' }) + }) +}) diff --git a/test/main/cli/stdin.test.ts b/test/main/cli/stdin.test.ts new file mode 100644 index 0000000000..e0372042e3 --- /dev/null +++ b/test/main/cli/stdin.test.ts @@ -0,0 +1,29 @@ +import { Readable } from 'node:stream' +import { describe, expect, it } from 'vitest' +import { readBoundedUtf8Stdin } from '../../../src/cli/stdin' + +describe('CLI standard input', () => { + it('reads chunked UTF-8 without changing the prompt', async () => { + const input = Readable.from([Buffer.from('你好'), Buffer.from('\nDeepChat')]) + + await expect(readBoundedUtf8Stdin(input, new AbortController().signal, 64)).resolves.toBe( + '你好\nDeepChat' + ) + }) + + it('rejects cumulative overflow before constructing the final string', async () => { + const input = Readable.from([Buffer.from('1234'), Buffer.from('56789')]) + + await expect( + readBoundedUtf8Stdin(input, new AbortController().signal, 8) + ).rejects.toMatchObject({ code: 'body_too_large', exitCode: 2 }) + }) + + it('rejects malformed UTF-8', async () => { + const input = Readable.from([Buffer.from([0xc3, 0x28])]) + + await expect( + readBoundedUtf8Stdin(input, new AbortController().signal, 8) + ).rejects.toMatchObject({ code: 'invalid_request', exitCode: 2 }) + }) +}) diff --git a/test/main/cli/surface.test.ts b/test/main/cli/surface.test.ts new file mode 100644 index 0000000000..0a3f7bba94 --- /dev/null +++ b/test/main/cli/surface.test.ts @@ -0,0 +1,591 @@ +import { describe, expect, it } from 'vitest' +import { DEEPCHAT_ROUTE_CATALOG } from '@shared/contracts/routes' +import { + CLI_SURFACE_V1, + getCliSurfaceEntry, + listCliSurfaceCapabilities, + resolveCliSurfaceEffect +} from '@/cli/surface' + +const humanApprovalCaller = { principal: 'human' } as const +const agentApprovalCaller = { principal: 'agent' } as const + +describe('CLI surface V1', () => { + it('contains only explicit canonical route contracts', () => { + const methods = Array.from(CLI_SURFACE_V1.keys()).sort() + + expect(methods).toEqual([ + 'artifacts.delete', + 'artifacts.describe', + 'artifacts.read', + 'audio.transcribeArtifact', + 'audio.transcribeUpload', + 'cli.capabilities', + 'cli.doctor', + 'cli.status', + 'cli.version', + 'events.subscribe', + 'images.generate', + 'mcp.addPublic', + 'mcp.listPublic', + 'mcp.removePublic', + 'mcp.setPublicStatus', + 'mcp.startPublic', + 'mcp.stopPublic', + 'mcp.updatePublic', + 'models.getPublicConfig', + 'models.invoke', + 'models.listRuntime', + 'models.resetConfig', + 'models.setPublicConfig', + 'models.setStatus', + 'ocr.clearCache', + 'ocr.extractArtifact', + 'ocr.extractUpload', + 'ocr.getRuntimeStatus', + 'providers.addPublic', + 'providers.listPublic', + 'providers.remove', + 'providers.setCredential', + 'providers.testPublicConnection', + 'providers.updatePublic', + 'runs.cancel', + 'runs.get', + 'sessions.runDetached', + 'settings.getPublic', + 'settings.updatePublic', + 'skills.installPublicUrl', + 'skills.installUpload', + 'skills.listPublic', + 'skills.setPublicStatus', + 'skills.uninstallPublic', + 'speech.generate', + 'videos.generate' + ]) + for (const [method, entry] of CLI_SURFACE_V1) { + expect(entry.contract).toBe( + DEEPCHAT_ROUTE_CATALOG[method as keyof typeof DEEPCHAT_ROUTE_CATALOG] + ) + } + }) + + it('denies methods that are not explicitly listed', () => { + expect(getCliSurfaceEntry('settings.getSnapshot')).toBeUndefined() + expect(getCliSurfaceEntry('mcp.callTool')).toBeUndefined() + expect(getCliSurfaceEntry('mcp.getServers')).toBeUndefined() + expect(getCliSurfaceEntry('mcp.credentials.set')).toBeUndefined() + expect(getCliSurfaceEntry('databaseSecurity.disable')).toBeUndefined() + expect(getCliSurfaceEntry('approvals.resolve')).toBeUndefined() + }) + + it('keeps Agent mutation policy as an explicit operation opt-in', () => { + const policies = Array.from(CLI_SURFACE_V1, ([method, entry]) => ({ method, entry })).filter( + ({ entry }) => entry.agentPolicy !== undefined + ) + + expect( + policies + .filter(({ entry }) => entry.agentPolicy === 'approval') + .map(({ method }) => method) + .sort() + ).toEqual(['mcp.addPublic', 'settings.updatePublic', 'skills.installPublicUrl']) + expect( + policies.filter(({ entry }) => entry.agentPolicy === 'allow').map(({ method }) => method) + ).toEqual(['runs.cancel']) + for (const { entry } of policies) { + expect(entry.callers).toContain('agent') + if (entry.agentPolicy === 'approval') expect(entry.approval).toBe('policy') + } + }) + + it('classifies public setting changes from their validated key', () => { + const entry = getCliSurfaceEntry('settings.updatePublic')! + + expect( + resolveCliSurfaceEffect(entry, { + changes: [{ key: 'fontSizeLevel', value: 3 }] + }) + ).toBe('preference-write') + expect( + resolveCliSurfaceEffect(entry, { + changes: [{ key: 'loggingEnabled', value: true }] + }) + ).toBe('security-config') + expect( + resolveCliSurfaceEffect(entry, { + changes: [{ key: 'ocrBackend', value: 'cpu' }] + }) + ).toBe('execution-config') + expect( + entry.agentInputAllowed?.({ changes: [{ key: 'privacyModeEnabled', value: true }] }) + ).toBe(false) + expect( + entry.approvalDisplay?.( + { changes: [{ key: 'privacyModeEnabled', value: true }] }, + humanApprovalCaller + ) + ).toEqual({ changes: [{ key: 'privacyModeEnabled', value: true }] }) + }) + + it('never projects provider credential material into approval or audit metadata', () => { + const entry = getCliSurfaceEntry('providers.setCredential')! + const input = { + providerId: 'provider-1', + action: 'set', + kind: 'api-key', + value: 'super-secret' + } + + expect(entry.auditProjection?.(input)).toEqual({ + providerId: 'provider-1', + action: 'set', + kind: 'api-key' + }) + expect(entry.approvalDisplay?.(input, humanApprovalCaller)).toEqual({ + providerId: 'provider-1', + action: 'set', + kind: 'api-key' + }) + expect(JSON.stringify(entry.approvalDisplay?.(input, humanApprovalCaller))).not.toContain( + 'super-secret' + ) + }) + + it('shows safe mutation values in approvals while keeping audits structural', () => { + const providerEntry = getCliSurfaceEntry('providers.updatePublic')! + const providerInput = { + providerId: 'provider-1', + updates: { baseUrl: 'https://api.example/v1', enabled: false } + } + expect(providerEntry.auditProjection?.(providerInput)).toEqual({ + providerId: 'provider-1', + fields: ['baseUrl', 'enabled'] + }) + expect(providerEntry.approvalDisplay?.(providerInput, humanApprovalCaller)).toEqual( + providerInput + ) + + const modelEntry = getCliSurfaceEntry('models.setPublicConfig')! + const modelInput = { + providerId: 'provider-1', + modelId: 'model-1', + config: { maxTokens: 4096, contextLength: 32768 } + } + expect(modelEntry.approvalDisplay?.(modelInput, humanApprovalCaller)).toEqual(modelInput) + }) + + it('keeps signed Skill URL secrets out of approval and audit projections', () => { + const entry = getCliSurfaceEntry('skills.installPublicUrl')! + const input = { + agentId: 'deepchat', + url: 'https://skills.example/archive.zip?signature=private-token', + overwrite: true + } + + expect(entry.approvalDisplay?.(input, humanApprovalCaller)).toEqual({ + agentId: 'deepchat', + overwrite: true, + origin: 'https://skills.example', + path: '/archive.zip', + queryPresent: true + }) + expect(JSON.stringify(entry.auditProjection?.(input))).not.toContain('private-token') + expect(entry.agentInputAllowed?.(input)).toBe(false) + expect( + entry.agentInputAllowed?.({ + ...input, + url: 'https://skills.example/archive.zip' + }) + ).toBe(true) + expect(getCliSurfaceEntry('skills.setPublicStatus')?.limits.timeoutMs).toBeGreaterThanOrEqual( + 2 * 60_000 + ) + expect(getCliSurfaceEntry('skills.uninstallPublic')?.limits.timeoutMs).toBeGreaterThanOrEqual( + 2 * 60_000 + ) + }) + + it('keeps MCP secret values and command arguments out of bounded metadata', () => { + const entry = getCliSurfaceEntry('mcp.addPublic')! + const input = { + serverName: 'private-server', + config: { + type: 'http', + baseUrl: 'https://mcp.example/private/path', + description: 'description'.repeat(2_000), + args: ['--token', 'argument-secret'], + environment: { PRIVATE_TOKEN: 'environment-secret' }, + headers: { Authorization: 'header-secret' }, + authorization: { + mode: 'client_credentials', + clientId: 'private-client-id' + } + } + } + + const approval = entry.approvalDisplay?.(input, humanApprovalCaller) + const audit = entry.auditProjection?.(input) + const serialized = JSON.stringify({ approval, audit }) + expect(approval).toMatchObject({ + serverName: 'private-server', + config: { + type: 'http', + argumentCount: 2, + endpoint: { origin: 'https://mcp.example', pathPresent: true }, + environment: { count: 1, names: ['PRIVATE_TOKEN'] }, + headers: { count: 1, names: ['Authorization'] }, + authorization: { mode: 'client_credentials' } + } + }) + for (const secret of [ + 'argument-secret', + 'environment-secret', + 'header-secret', + 'private-client-id', + '/private/path' + ]) { + expect(serialized).not.toContain(secret) + } + expect(Buffer.byteLength(JSON.stringify(approval), 'utf8')).toBeLessThan(16 * 1024) + expect(resolveCliSurfaceEffect(entry, input)).toBe('credential') + expect( + resolveCliSurfaceEffect(entry, { + serverName: 'public-server', + config: { type: 'stdio', command: 'npx', environment: {} } + }) + ).toBe('supply-chain') + expect( + resolveCliSurfaceEffect(entry, { + serverName: 'authorized-server', + config: { + type: 'http', + baseUrl: 'https://mcp.example/api', + headers: {}, + authorization: { mode: 'interactive' } + } + }) + ).toBe('security-config') + }) + + it('limits Agent MCP additions to disabled reviewable remote configurations', () => { + const entry = getCliSurfaceEntry('mcp.addPublic')! + const input = { + serverName: 'reviewable-server', + config: { + type: 'http', + description: 'Reviewable\0remote\u0085server', + icon: 'cloud', + baseUrl: 'https://mcp.example/api', + headers: {} + } + } + + expect(entry.agentInputAllowed?.(input)).toBe(true) + expect(entry.approvalDisplay?.(input, agentApprovalCaller)).toMatchObject({ + serverName: 'reviewable-server', + config: { + description: 'Reviewableremoteserver', + descriptionTruncated: false, + icon: 'cloud', + endpointUrl: 'https://mcp.example/api' + } + }) + expect(entry.auditProjection?.(input)).not.toEqual( + expect.objectContaining({ command: expect.anything(), arguments: expect.anything() }) + ) + + expect( + entry.agentInputAllowed?.({ + ...input, + config: { ...input.config, headers: { Authorization: 'secret' } } + }) + ).toBe(false) + expect( + entry.agentInputAllowed?.({ + serverName: 'stdio-server', + config: { + type: 'stdio', + command: 'npx', + args: ['@example/mcp-server'], + environment: {}, + inheritEnv: 'minimal' + } + }) + ).toBe(false) + expect( + entry.agentInputAllowed?.({ + serverName: 'authorized-server', + config: { + type: 'http', + baseUrl: 'https://mcp.example/api', + headers: {}, + authorization: { mode: 'interactive' } + } + }) + ).toBe(false) + expect( + entry.agentInputAllowed?.({ + ...input, + config: { ...input.config, description: 'x'.repeat(16 * 1024) } + }) + ).toBe(false) + expect(getCliSurfaceEntry('mcp.updatePublic')?.callers).toEqual(['human']) + }) + + it('gives every approval route enough server time for renderer confirmation', () => { + for (const capability of listCliSurfaceCapabilities()) { + if (capability.approval !== 'policy') continue + expect(capability.timeoutMs, capability.method).toBeGreaterThanOrEqual(2 * 60_000) + } + }) + + it('classifies MCP updates by their highest-impact field', () => { + const entry = getCliSurfaceEntry('mcp.updatePublic')! + + expect(resolveCliSurfaceEffect(entry, { updates: { description: 'renamed' } })).toBe( + 'execution-config' + ) + expect(resolveCliSurfaceEffect(entry, { updates: { authorization: null } })).toBe( + 'security-config' + ) + expect(resolveCliSurfaceEffect(entry, { updates: { command: 'npx' } })).toBe('supply-chain') + expect(resolveCliSurfaceEffect(entry, { updates: { headers: {} } })).toBe('credential') + }) + + it('publishes stable sorted capability metadata', () => { + expect(listCliSurfaceCapabilities()).toEqual([ + expect.objectContaining({ + method: 'artifacts.delete', + possibleEffects: ['local-maintenance'] + }), + expect.objectContaining({ method: 'artifacts.describe', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'artifacts.read', + possibleEffects: ['read'], + transport: 'download' + }), + expect.objectContaining({ + method: 'audio.transcribeArtifact', + possibleEffects: ['compute'], + transport: 'rpc', + callers: ['human', 'agent'], + scopes: ['audio:transcribe', 'artifacts:read'] + }), + expect.objectContaining({ + method: 'audio.transcribeUpload', + possibleEffects: ['compute'], + transport: 'upload', + callers: ['human'] + }), + expect.objectContaining({ method: 'cli.capabilities', possibleEffects: ['read'] }), + expect.objectContaining({ method: 'cli.doctor', possibleEffects: ['read'] }), + expect.objectContaining({ method: 'cli.status', possibleEffects: ['read'] }), + expect.objectContaining({ method: 'cli.version', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'events.subscribe', + possibleEffects: ['read'], + transport: 'stream', + callers: ['human'], + scopes: ['runs:read'] + }), + expect.objectContaining({ + method: 'images.generate', + possibleEffects: ['compute'], + transport: 'stream' + }), + expect.objectContaining({ + method: 'mcp.addPublic', + possibleEffects: ['security-config', 'supply-chain', 'credential'], + callers: ['human', 'agent'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'mcp.listPublic', + possibleEffects: ['read'], + callers: ['human', 'agent'] + }), + expect.objectContaining({ + method: 'mcp.removePublic', + possibleEffects: ['destructive'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'mcp.setPublicStatus', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'mcp.startPublic', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'mcp.stopPublic', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'mcp.updatePublic', + possibleEffects: ['execution-config', 'security-config', 'supply-chain', 'credential'], + callers: ['human'], + approval: 'policy' + }), + expect.objectContaining({ method: 'models.getPublicConfig', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'models.invoke', + possibleEffects: ['compute'], + transport: 'stream' + }), + expect.objectContaining({ method: 'models.listRuntime', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'models.resetConfig', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'models.setPublicConfig', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'models.setStatus', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'ocr.clearCache', + possibleEffects: ['local-maintenance'], + approval: 'never', + callers: ['human'] + }), + expect.objectContaining({ + method: 'ocr.extractArtifact', + possibleEffects: ['compute'], + transport: 'rpc', + callers: ['human', 'agent'], + scopes: ['ocr:extract', 'artifacts:read'] + }), + expect.objectContaining({ + method: 'ocr.extractUpload', + possibleEffects: ['compute'], + transport: 'upload', + callers: ['human'] + }), + expect.objectContaining({ method: 'ocr.getRuntimeStatus', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'providers.addPublic', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ method: 'providers.listPublic', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'providers.remove', + possibleEffects: ['destructive'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'providers.setCredential', + possibleEffects: ['credential'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'providers.testPublicConnection', + possibleEffects: ['compute'], + approval: 'never' + }), + expect.objectContaining({ + method: 'providers.updatePublic', + possibleEffects: ['execution-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'runs.cancel', + possibleEffects: ['local-maintenance'], + callers: ['human', 'agent'], + scopes: ['runs:cancel'] + }), + expect.objectContaining({ + method: 'runs.get', + possibleEffects: ['read'], + callers: ['human', 'agent'], + scopes: ['runs:read'] + }), + expect.objectContaining({ + method: 'sessions.runDetached', + possibleEffects: ['compute'], + callers: ['human'], + scopes: ['sessions:run'] + }), + expect.objectContaining({ method: 'settings.getPublic', possibleEffects: ['read'] }), + expect.objectContaining({ + method: 'settings.updatePublic', + possibleEffects: ['preference-write', 'execution-config', 'security-config'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'skills.installPublicUrl', + possibleEffects: ['supply-chain'], + callers: ['human', 'agent'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'skills.installUpload', + possibleEffects: ['supply-chain'], + callers: ['human'], + transport: 'upload', + approval: 'policy' + }), + expect.objectContaining({ + method: 'skills.listPublic', + possibleEffects: ['read'], + callers: ['human', 'agent'] + }), + expect.objectContaining({ + method: 'skills.setPublicStatus', + possibleEffects: ['execution-config'], + callers: ['human'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'skills.uninstallPublic', + possibleEffects: ['destructive'], + callers: ['human'], + approval: 'policy' + }), + expect.objectContaining({ + method: 'speech.generate', + possibleEffects: ['compute'], + transport: 'stream' + }), + expect.objectContaining({ + method: 'videos.generate', + possibleEffects: ['compute'], + transport: 'stream' + }) + ]) + expect( + listCliSurfaceCapabilities() + .filter((capability) => capability.approval === 'policy') + .map((capability) => capability.method) + ).toEqual([ + 'mcp.addPublic', + 'mcp.removePublic', + 'mcp.setPublicStatus', + 'mcp.startPublic', + 'mcp.stopPublic', + 'mcp.updatePublic', + 'models.resetConfig', + 'models.setPublicConfig', + 'models.setStatus', + 'providers.addPublic', + 'providers.remove', + 'providers.setCredential', + 'providers.updatePublic', + 'settings.updatePublic', + 'skills.installPublicUrl', + 'skills.installUpload', + 'skills.setPublicStatus', + 'skills.uninstallPublic' + ]) + }) +}) diff --git a/test/main/cli/transport.test.ts b/test/main/cli/transport.test.ts new file mode 100644 index 0000000000..0fceddbf54 --- /dev/null +++ b/test/main/cli/transport.test.ts @@ -0,0 +1,315 @@ +import { createHash, randomUUID } from 'node:crypto' +import { mkdtemp, rm, symlink, writeFile } from 'node:fs/promises' +import { createServer, type RequestListener, type Server } from 'node:http' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION, + LOCAL_CONTROL_UPLOAD_REQUEST_HEADER, + LocalControlUploadRequestSchema, + createLocalControlSuccess, + type LocalControlDescriptor, + type LocalControlEndpoint, + type LocalControlEventEnvelope +} from '@shared/contracts/localControl' +import { + invokeLocalControlRpc, + invokeLocalControlStream, + invokeLocalControlUpload +} from '../../../src/cli/transport' + +const servers: Server[] = [] +const socketPaths: string[] = [] +const temporaryDirectories: string[] = [] + +function createEndpoint(): LocalControlEndpoint { + if (process.platform === 'win32') { + return { kind: 'pipe', name: `\\\\.\\pipe\\deepchat-cli-test-${randomUUID()}` } + } + const socketPath = `/tmp/deepchat-cli-${randomUUID()}.sock` + socketPaths.push(socketPath) + return { kind: 'unix', path: socketPath } +} + +async function listen( + listener: RequestListener, + checkContinueListener?: RequestListener +): Promise { + const endpoint = createEndpoint() + const server = createServer(listener) + if (checkContinueListener) server.on('checkContinue', checkContinueListener) + servers.push(server) + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(endpoint.kind === 'unix' ? endpoint.path : endpoint.name, resolve) + }) + return { + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + appVersion: '1.2.3', + endpoint, + pid: process.pid, + token: 't'.repeat(43), + startedAt: Date.now() + } +} + +async function invoke(descriptor: LocalControlDescriptor) { + return await invokeLocalControlRpc({ + descriptor, + token: descriptor.token, + id: 'request-1', + method: 'cli.version', + params: {}, + signal: new AbortController().signal + }) +} + +async function invokeStream( + descriptor: LocalControlDescriptor, + onEvent: (event: LocalControlEventEnvelope) => void | Promise +) { + return await invokeLocalControlStream( + { + descriptor, + token: descriptor.token, + id: 'request-1', + method: 'models.invoke', + params: { + providerId: 'provider-1', + modelId: 'model-1', + messages: [{ role: 'user', content: 'hello' }] + }, + signal: new AbortController().signal + }, + onEvent + ) +} + +afterEach(async () => { + await Promise.all( + servers.splice(0).map( + (server) => + new Promise((resolve) => { + server.closeAllConnections() + server.close(() => resolve()) + }) + ) + ) + await Promise.all(socketPaths.splice(0).map((socketPath) => rm(socketPath, { force: true }))) + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('CLI response transport', () => { + it('rejects a response envelope for another request', async () => { + const descriptor = await listen((_request, response) => { + response.setHeader('content-type', 'application/json; charset=utf-8') + response.end(JSON.stringify(createLocalControlSuccess('request-2', {}))) + }) + + await expect(invoke(descriptor)).rejects.toMatchObject({ + code: 'internal_error', + exitCode: 8 + }) + }) + + it('rejects an oversized declared response before buffering it', async () => { + const descriptor = await listen((_request, response) => { + response.setHeader('content-type', 'application/json; charset=utf-8') + response.setHeader('content-length', 16 * 1024 * 1024 + 1) + response.flushHeaders() + }) + + await expect(invoke(descriptor)).rejects.toMatchObject({ + code: 'internal_error', + exitCode: 8 + }) + }) + + it('requires HTTP status and the typed envelope to agree', async () => { + const descriptor = await listen((_request, response) => { + response.statusCode = 500 + response.setHeader('content-type', 'application/json; charset=utf-8') + response.end(JSON.stringify(createLocalControlSuccess('request-1', {}))) + }) + + await expect(invoke(descriptor)).rejects.toMatchObject({ + code: 'internal_error', + exitCode: 8 + }) + }) + + it('preserves cancellation after JSON response headers arrive', async () => { + const descriptor = await listen((_request, response) => { + response.setHeader('content-type', 'application/json; charset=utf-8') + response.flushHeaders() + }) + const controller = new AbortController() + const result = invokeLocalControlRpc({ + descriptor, + token: descriptor.token, + id: 'request-1', + method: 'cli.version', + params: {}, + signal: controller.signal + }) + controller.abort(new Error('cancelled-by-test')) + + await expect(result).rejects.toMatchObject({ message: 'cancelled-by-test' }) + }) + + it('consumes ordered NDJSON events before the terminal envelope', async () => { + const descriptor = await listen((_request, response) => { + response.setHeader('content-type', 'application/x-ndjson; charset=utf-8') + response.end( + [ + { + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + sequence: 0, + timestamp: Date.now(), + requestId: 'request-1', + event: 'models.invoke', + data: { type: 'text_delta', text: 'hello' } + }, + createLocalControlSuccess('request-1', { + providerId: 'provider-1', + modelId: 'model-1', + text: 'hello', + finishReason: 'complete', + latency: { queueMs: 0, firstEventMs: 1, firstTextMs: 1, totalMs: 10 } + }) + ] + .map((record) => JSON.stringify(record)) + .join('\n') + '\n' + ) + }) + const events: LocalControlEventEnvelope[] = [] + + const result = await invokeStream(descriptor, async (event) => events.push(event)) + + expect(events).toHaveLength(1) + expect(events[0]).toMatchObject({ sequence: 0, data: { text: 'hello' } }) + expect(result).toMatchObject({ ok: true, result: { text: 'hello' } }) + }) + + it('rejects out-of-order stream events', async () => { + const descriptor = await listen((_request, response) => { + response.setHeader('content-type', 'application/x-ndjson; charset=utf-8') + response.end( + `${JSON.stringify({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + sequence: 1, + timestamp: Date.now(), + requestId: 'request-1', + event: 'models.invoke', + data: { type: 'text_delta', text: 'hello' } + })}\n` + ) + }) + + await expect(invokeStream(descriptor, async () => undefined)).rejects.toMatchObject({ + code: 'internal_error', + exitCode: 8 + }) + }) + + it('uploads a stable regular-file snapshot with a typed envelope header', async () => { + let receivedBody = Buffer.alloc(0) + let receivedEnvelope: unknown + let receivedExpectHeader: string | undefined + let bytesBeforeContinue = 0 + let continueSent = false + const handleUpload: RequestListener = (request, response) => { + const rawEnvelope = request.headers[LOCAL_CONTROL_UPLOAD_REQUEST_HEADER] + receivedEnvelope = LocalControlUploadRequestSchema.parse( + JSON.parse(Buffer.from(String(rawEnvelope), 'base64url').toString('utf8')) + ) + const chunks: Buffer[] = [] + request.on('data', (chunk: Buffer) => chunks.push(chunk)) + request.once('end', () => { + receivedBody = Buffer.concat(chunks) + response.setHeader('content-type', 'application/json; charset=utf-8') + response.end(JSON.stringify(createLocalControlSuccess('request-1', { accepted: true }))) + }) + } + const descriptor = await listen(handleUpload, (request, response) => { + receivedExpectHeader = request.headers.expect + request.on('data', (chunk: Buffer) => { + if (!continueSent) bytesBeforeContinue += chunk.length + }) + setImmediate(() => { + continueSent = true + response.writeContinue() + handleUpload(request, response) + }) + }) + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-upload-')) + temporaryDirectories.push(directory) + const filePath = path.join(directory, 'sample.wav') + await writeFile(filePath, 'audio-bytes') + + const result = await invokeLocalControlUpload({ + descriptor, + token: descriptor.token, + id: 'request-1', + method: 'audio.transcribeUpload', + params: { mimeType: 'audio/wav', filename: 'sample.wav' }, + signal: new AbortController().signal, + filePath, + maxBytes: 64 + }) + + expect(result).toMatchObject({ ok: true, result: { accepted: true } }) + expect(receivedExpectHeader).toBe('100-continue') + expect(bytesBeforeContinue).toBe(0) + expect(receivedEnvelope).toMatchObject({ + id: 'request-1', + method: 'audio.transcribeUpload', + params: { filename: 'sample.wav' }, + upload: { + size: 11, + sha256: createHash('sha256').update('audio-bytes').digest('hex') + } + }) + expect(receivedBody).toEqual(Buffer.from('audio-bytes')) + }) + + it.runIf(process.platform !== 'win32')( + 'rejects symlink upload sources before connecting', + async () => { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-upload-link-')) + temporaryDirectories.push(directory) + const targetPath = path.join(directory, 'target.wav') + const linkPath = path.join(directory, 'link.wav') + await writeFile(targetPath, 'audio-bytes') + await symlink(targetPath, linkPath) + + await expect( + invokeLocalControlUpload({ + descriptor: { + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + appVersion: '1.2.3', + endpoint: { kind: 'unix', path: '/tmp/unused-deepchat.sock' }, + pid: process.pid, + token: 't'.repeat(43), + startedAt: Date.now() + }, + token: 't'.repeat(43), + id: 'request-1', + method: 'audio.transcribeUpload', + params: {}, + signal: new AbortController().signal, + filePath: linkPath, + maxBytes: 64 + }) + ).rejects.toMatchObject({ code: 'invalid_request', exitCode: 2 }) + } + ) +}) diff --git a/test/main/contracts/localControl.test.ts b/test/main/contracts/localControl.test.ts new file mode 100644 index 0000000000..940420aea3 --- /dev/null +++ b/test/main/contracts/localControl.test.ts @@ -0,0 +1,108 @@ +import { describe, expect, it } from 'vitest' +import { + LOCAL_CONTROL_PROTOCOL_VERSION, + LOCAL_CONTROL_SURFACE_VERSION, + LocalControlDescriptorSchema, + LocalControlRpcRequestSchema, + LocalControlScopesSchema, + createLocalControlFailure, + createLocalControlSuccess +} from '@shared/contracts/localControl' +import { LocalControlCapabilitySchema } from '@shared/contracts/routes' + +const validDescriptor = { + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + appVersion: '1.2.3', + endpoint: { kind: 'unix', path: '/tmp/deepchat.sock' }, + pid: 42, + token: 'a'.repeat(43), + startedAt: 1_000 +} as const + +const validRpcRequest = { + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + id: 'request-1', + method: 'models.invoke', + params: { prompt: 'hello' } +} as const + +describe('local-control contracts', () => { + it('accepts a bounded private endpoint descriptor', () => { + expect(LocalControlDescriptorSchema.parse(validDescriptor)).toMatchObject({ + endpoint: { kind: 'unix', path: '/tmp/deepchat.sock' }, + token: 'a'.repeat(43) + }) + }) + + it.each([ + ['unsupported protocol version', { protocolVersion: 2 }], + [ + 'NUL in the endpoint path', + { endpoint: { kind: 'unix', path: '/tmp/deepchat.sock\0hidden' } } + ], + ['non-positive pid', { pid: 0 }], + ['short token', { token: 'secret' }], + ['unknown key', { ignored: true }] + ])('rejects a descriptor with %s', (_label, override) => { + expect( + LocalControlDescriptorSchema.safeParse({ ...validDescriptor, ...override }).success + ).toBe(false) + }) + + it('rejects duplicate scopes and capability callers', () => { + expect(() => LocalControlScopesSchema.parse(['models:invoke', 'models:invoke'])).toThrow( + 'Duplicate local-control scope' + ) + expect(() => + LocalControlCapabilitySchema.parse({ + method: 'models.invoke', + possibleEffects: ['compute'], + callers: ['human', 'human'], + scopes: ['models:invoke'], + transport: 'stream', + approval: 'never', + maxBodyBytes: 1024, + timeoutMs: 1000 + }) + ).toThrow('Duplicate local-control caller') + }) + + it('requires versioned JSON RPC requests with domain methods', () => { + expect(LocalControlRpcRequestSchema.parse(validRpcRequest)).toMatchObject({ + id: 'request-1', + method: 'models.invoke' + }) + }) + + it.each([ + ['invalid request id', { id: 'request with spaces' }], + ['non-domain method', { method: 'invoke' }] + ])('rejects an RPC request with %s', (_label, override) => { + expect( + LocalControlRpcRequestSchema.safeParse({ ...validRpcRequest, ...override }).success + ).toBe(false) + }) + + it('creates stable success and failure envelopes', () => { + expect(createLocalControlSuccess('request-1', { ready: true })).toEqual({ + protocolVersion: LOCAL_CONTROL_PROTOCOL_VERSION, + surfaceVersion: LOCAL_CONTROL_SURFACE_VERSION, + id: 'request-1', + ok: true, + result: { ready: true } + }) + expect( + createLocalControlFailure('request-2', { + code: 'unavailable', + message: 'Desktop application is not running', + retriable: true + }) + ).toMatchObject({ + id: 'request-2', + ok: false, + error: { code: 'unavailable', retriable: true } + }) + }) +}) diff --git a/test/main/desktop/sessionBinding.test.ts b/test/main/desktop/sessionBinding.test.ts index 6d5b33a46e..d6dedb8bee 100644 --- a/test/main/desktop/sessionBinding.test.ts +++ b/test/main/desktop/sessionBinding.test.ts @@ -13,14 +13,17 @@ describe('DesktopSessionBinding', () => { await binding.activate(1, 'missing') await binding.activate(2, 'available') + binding.bind(3, 'available') expect(binding.getActiveId(1)).toBe('missing') expect(binding.getActiveId(2)).toBe('available') + expect(binding.getWebContentsIdsForSession('available')).toEqual([2, 3]) await expect(binding.getActive(1)).resolves.toBeNull() expect(binding.getActiveId(1)).toBeNull() await binding.deactivate(2) expect(binding.getActiveId(2)).toBeNull() + expect(binding.getWebContentsIdsForSession('available')).toEqual([3]) expect(projection.notify).toHaveBeenLastCalledWith({ sessionIds: [], reason: 'deactivated', diff --git a/test/main/events/typedEventHub.test.ts b/test/main/events/typedEventHub.test.ts new file mode 100644 index 0000000000..cffc0991f7 --- /dev/null +++ b/test/main/events/typedEventHub.test.ts @@ -0,0 +1,444 @@ +import { describe, expect, it, vi } from 'vitest' +import { SessionEventRouter } from '@/events/sessionEventRouter' +import { + TypedEventHub, + TypedEventHubOverflowError, + type TypedEventRecord +} from '@/events/typedEventHub' + +function createHub(options: Partial[0]> = {}): { + hub: TypedEventHub + broadcast: ReturnType + send: ReturnType +} { + const broadcast = vi.fn() + const send = vi.fn() + return { + hub: new TypedEventHub({ + renderer: { broadcast, send }, + epoch: 'test-epoch', + now: () => 123, + ...options + }), + broadcast, + send + } +} + +async function nextEvent(events: AsyncIterable): Promise { + const result = await events[Symbol.asyncIterator]().next() + if (result.done) throw new Error('Expected an event') + return result.value +} + +describe('TypedEventHub', () => { + it('delivers renderer targets without creating stream subscriptions', () => { + const { hub, broadcast, send } = createHub() + + hub.publish( + 'sessions.status.changed', + { sessionId: 'session-1', status: 'generating', version: 1 }, + { kind: 'renderer-all' } + ) + hub.publish( + 'sessions.status.changed', + { sessionId: 'session-2', status: 'idle', version: 2 }, + { kind: 'renderer', webContentsId: 7 } + ) + + expect(broadcast).toHaveBeenCalledWith({ + name: 'sessions.status.changed', + payload: { sessionId: 'session-1', status: 'generating', version: 1 } + }) + expect(send).toHaveBeenCalledWith(7, { + name: 'sessions.status.changed', + payload: { sessionId: 'session-2', status: 'idle', version: 2 } + }) + }) + + it('isolates run targets and replays retained events after a cursor', async () => { + const { hub } = createHub() + const runOne = hub.subscribe({ kind: 'run', runId: 'run-1' }) + const runTwo = hub.subscribe({ kind: 'run', runId: 'run-2' }) + + hub.publish( + 'sessions.status.changed', + { sessionId: 'run-1', status: 'generating', version: 1 }, + { kind: 'run', runId: 'run-1' } + ) + const first = await nextEvent(runOne.events) + expect(first.cursor).toBe('test-epoch_1:1') + + const replay = hub.subscribe( + { kind: 'run', runId: 'run-1' }, + { afterCursor: runOne.initialCursor } + ) + expect(replay.recoveryReason).toBeNull() + await expect(nextEvent(replay.events)).resolves.toEqual(first) + + const runTwoIterator = runTwo.events[Symbol.asyncIterator]() + const pendingRunTwo = runTwoIterator.next() + runTwo.close() + await expect(pendingRunTwo).resolves.toEqual({ value: undefined, done: true }) + }) + + it('requires a snapshot when a cursor belongs to another process epoch', () => { + const { hub } = createHub() + const subscription = hub.subscribe( + { kind: 'run', runId: 'run-1' }, + { afterCursor: 'old-epoch:42' } + ) + + expect(subscription.recoveryReason).toBe('server_restarted') + expect(subscription.initialCursor).toBe('test-epoch_1:0') + }) + + it('expires cursors when an evicted stream is recreated in the same process', () => { + const { hub } = createHub({ maxStreams: 1 }) + const first = hub.subscribe({ kind: 'run', runId: 'run-1' }) + first.close() + const other = hub.subscribe({ kind: 'run', runId: 'run-2' }) + other.close() + + const recreated = hub.subscribe( + { kind: 'run', runId: 'run-1' }, + { afterCursor: first.initialCursor } + ) + + expect(recreated.recoveryReason).toBe('cursor_expired') + expect(recreated.initialCursor).toBe('test-epoch_3:0') + }) + + it('expires idle streams before accepting a stale cursor', () => { + let now = 0 + const { hub } = createHub({ + now: () => now, + streamIdleTtlMs: 10 + }) + const first = hub.subscribe({ kind: 'run', runId: 'run-1' }) + first.close() + hub.publish( + 'sessions.status.changed', + { sessionId: 'run-1', status: 'generating', version: 1 }, + { kind: 'run', runId: 'run-1' } + ) + now = 11 + + const recreated = hub.subscribe( + { kind: 'run', runId: 'run-1' }, + { afterCursor: first.initialCursor } + ) + + expect(recreated.recoveryReason).toBe('cursor_expired') + expect(recreated.initialCursor).toBe('test-epoch_2:0') + }) + + it('expires a cursor when the global retention budget evicts its event', () => { + const { hub } = createHub({ maxTotalRetainedBytes: 1024 }) + const first = hub.subscribe({ kind: 'run', runId: 'run-1' }) + first.close() + hub.publish( + 'chat.stream.failed', + { + requestId: 'request-1', + sessionId: 'run-1', + messageId: 'message-1', + failedAt: 1, + error: 'x'.repeat(600) + }, + { kind: 'run', runId: 'run-1' } + ) + const second = hub.subscribe({ kind: 'run', runId: 'run-2' }) + second.close() + hub.publish( + 'chat.stream.failed', + { + requestId: 'request-2', + sessionId: 'run-2', + messageId: 'message-2', + failedAt: 2, + error: 'y'.repeat(600) + }, + { kind: 'run', runId: 'run-2' } + ) + + const replay = hub.subscribe( + { kind: 'run', runId: 'run-1' }, + { afterCursor: first.initialCursor } + ) + + expect(replay.recoveryReason).toBe('cursor_expired') + expect(replay.initialCursor).toBe('test-epoch_1:1') + const retained = hub.subscribe( + { kind: 'run', runId: 'run-2' }, + { afterCursor: second.initialCursor } + ) + expect(retained.recoveryReason).toBeNull() + }) + + it('replays only the latest retained snapshot for a message', async () => { + const { hub } = createHub() + const live = hub.subscribe({ kind: 'run', runId: 'run-1' }) + hub.publish( + 'chat.stream.updated', + { + kind: 'snapshot', + requestId: 'request-1', + sessionId: 'run-1', + messageId: 'message-1', + updatedAt: 1, + blocks: [] + }, + { kind: 'run', runId: 'run-1' } + ) + const first = await nextEvent(live.events) + live.close() + hub.publish( + 'chat.stream.updated', + { + kind: 'snapshot', + requestId: 'request-1', + sessionId: 'run-1', + messageId: 'message-1', + updatedAt: 2, + blocks: [] + }, + { kind: 'run', runId: 'run-1' } + ) + + const replay = hub.subscribe({ kind: 'run', runId: 'run-1' }, { afterCursor: first.cursor }) + + expect(replay.recoveryReason).toBeNull() + await expect(nextEvent(replay.events)).resolves.toMatchObject({ + sequence: 2, + data: { messageId: 'message-1', updatedAt: 2 } + }) + }) + + it('terminates a slow subscriber instead of growing its queue', async () => { + const { hub } = createHub({ maxSubscriberEvents: 1, maxSubscriberBytes: 64 * 1024 }) + const subscription = hub.subscribe({ kind: 'run', runId: 'run-1' }) + + hub.publish( + 'sessions.status.changed', + { sessionId: 'run-1', status: 'generating', version: 1 }, + { kind: 'run', runId: 'run-1' } + ) + hub.publish( + 'sessions.status.changed', + { sessionId: 'run-1', status: 'idle', version: 2 }, + { kind: 'run', runId: 'run-1' } + ) + + await expect(nextEvent(subscription.events)).rejects.toBeInstanceOf(TypedEventHubOverflowError) + }) + + it('rejects an oversized event even while the subscriber is waiting', async () => { + const { hub } = createHub({ maxSubscriberBytes: 256 }) + const subscription = hub.subscribe({ kind: 'run', runId: 'run-1' }) + const pending = nextEvent(subscription.events) + + hub.publish( + 'chat.stream.failed', + { + requestId: 'request-1', + sessionId: 'run-1', + messageId: 'message-1', + failedAt: 123, + error: 'x'.repeat(512) + }, + { kind: 'run', runId: 'run-1' } + ) + + await expect(pending).rejects.toBeInstanceOf(TypedEventHubOverflowError) + }) +}) + +describe('SessionEventRouter', () => { + it('keeps CLI run content off all-window broadcasts', async () => { + const { hub, broadcast, send } = createHub() + const router = new SessionEventRouter({ + hub, + resolveSessionRunId: (sessionId) => (sessionId === 'cli-run' ? 'cli-run' : null), + getBoundRendererIds: (sessionId) => (sessionId === 'cli-run' ? [9] : []) + }) + const subscription = hub.subscribe({ kind: 'run', runId: 'cli-run' }) + + router.publish('chat.stream.updated', { + kind: 'snapshot', + requestId: 'request-1', + sessionId: 'cli-run', + messageId: 'message-1', + updatedAt: 123, + blocks: [] + }) + + expect(broadcast).not.toHaveBeenCalled() + expect(send).toHaveBeenCalledWith(9, { + name: 'chat.stream.updated', + payload: { + kind: 'snapshot', + requestId: 'request-1', + sessionId: 'cli-run', + messageId: 'message-1', + updatedAt: 123, + blocks: [] + } + }) + await expect(nextEvent(subscription.events)).resolves.toMatchObject({ + target: { kind: 'run', runId: 'cli-run' }, + event: 'chat.stream.updated' + }) + }) + + it('keeps CLI runs discoverable without broadcasting their transcript content', () => { + const { hub, broadcast, send } = createHub() + const router = new SessionEventRouter({ + hub, + resolveSessionRunId: (sessionId) => (sessionId === 'cli-run' ? 'cli-run' : null), + getBoundRendererIds: () => [9] + }) + + router.publish('sessions.updated', { + sessionIds: ['normal', 'cli-run'], + reason: 'updated' + }) + + expect(broadcast).toHaveBeenCalledWith({ + name: 'sessions.updated', + payload: { sessionIds: ['normal', 'cli-run'], reason: 'updated' } + }) + expect(send).not.toHaveBeenCalled() + }) + + it('suppresses full transcript notifications from CLI event streams', async () => { + const { hub, broadcast, send } = createHub() + const router = new SessionEventRouter({ + hub, + resolveSessionRunId: () => 'cli-run', + getBoundRendererIds: () => [9] + }) + const subscription = hub.subscribe({ kind: 'run', runId: 'cli-run' }) + + router.publish('sessions.messages.changed', { + sessionId: 'cli-run', + messages: [], + version: 1 + }) + + expect(broadcast).not.toHaveBeenCalled() + expect(send).toHaveBeenCalledTimes(1) + const iterator = subscription.events[Symbol.asyncIterator]() + const pending = iterator.next() + subscription.close() + await expect(pending).resolves.toEqual({ value: undefined, done: true }) + }) + + it('routes descendant session events to the root CLI run', async () => { + const { hub, broadcast } = createHub() + const resolveSessionRunId = vi.fn((sessionId: string) => + sessionId === 'child-session' ? 'root-run' : null + ) + const router = new SessionEventRouter({ + hub, + resolveSessionRunId, + getBoundRendererIds: () => [] + }) + const subscription = hub.subscribe({ kind: 'run', runId: 'root-run' }) + + router.publish('chat.stream.completed', { + requestId: 'request-1', + sessionId: 'child-session', + messageId: 'message-1', + completedAt: 123 + }) + router.publish('sessions.status.changed', { + sessionId: 'child-session', + status: 'idle', + version: 2 + }) + + expect(broadcast).not.toHaveBeenCalled() + expect(resolveSessionRunId).toHaveBeenCalledTimes(1) + await expect(nextEvent(subscription.events)).resolves.toMatchObject({ + target: { kind: 'run', runId: 'root-run' }, + event: 'chat.stream.completed' + }) + await expect(nextEvent(subscription.events)).resolves.toMatchObject({ + target: { kind: 'run', runId: 'root-run' }, + event: 'sessions.status.changed' + }) + }) + + it('drops late content events after session ownership can no longer be resolved', () => { + const { hub, broadcast, send } = createHub() + const router = new SessionEventRouter({ + hub, + resolveSessionRunId: () => undefined, + getBoundRendererIds: () => [] + }) + + router.publish('chat.stream.failed', { + requestId: 'request-1', + sessionId: 'deleted-session', + messageId: 'message-1', + failedAt: 123, + error: 'late failure' + }) + + expect(broadcast).not.toHaveBeenCalled() + expect(send).not.toHaveBeenCalled() + }) + + it('broadcasts deletion invalidations after the session row is gone', () => { + const { hub, broadcast, send } = createHub() + const router = new SessionEventRouter({ + hub, + resolveSessionRunId: () => undefined, + getBoundRendererIds: () => [] + }) + + router.publish('sessions.updated', { + sessionIds: ['deleted-session'], + reason: 'deleted' + }) + + expect(broadcast).toHaveBeenCalledWith({ + name: 'sessions.updated', + payload: { sessionIds: ['deleted-session'], reason: 'deleted' } + }) + expect(send).not.toHaveBeenCalled() + }) + + it('retries unknown ownership and invalidates cached ownership on session updates', async () => { + const { hub, broadcast } = createHub() + let runId: string | null | undefined + const resolveSessionRunId = vi.fn(() => runId) + const router = new SessionEventRouter({ + hub, + resolveSessionRunId, + getBoundRendererIds: () => [] + }) + const subscription = hub.subscribe({ kind: 'run', runId: 'cli-run' }) + const streamEvent = { + requestId: 'request-1', + sessionId: 'session-1', + messageId: 'message-1', + completedAt: 123 + } + + router.publish('chat.stream.completed', streamEvent) + runId = null + router.publish('chat.stream.completed', streamEvent) + runId = 'cli-run' + router.publish('sessions.updated', { sessionIds: ['session-1'], reason: 'updated' }) + router.publish('chat.stream.completed', streamEvent) + + expect(resolveSessionRunId).toHaveBeenCalledTimes(3) + expect(broadcast).toHaveBeenCalledTimes(2) + await expect(nextEvent(subscription.events)).resolves.toMatchObject({ + target: { kind: 'run', runId: 'cli-run' }, + event: 'chat.stream.completed' + }) + }) +}) diff --git a/test/main/notifications/routes.test.ts b/test/main/notifications/routes.test.ts index b5a3e61e50..18661f7fb0 100644 --- a/test/main/notifications/routes.test.ts +++ b/test/main/notifications/routes.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' +import { createRendererRouteContext } from '@/routes/routeRegistry' import { notificationAcknowledgePresentationRoute, notificationRendererReadyRoute @@ -14,7 +15,7 @@ describe('notification routes', () => { }) await expect( - routes.get(notificationRendererReadyRoute.name)?.({}, { webContentsId: 42, windowId: 7 }) + routes.get(notificationRendererReadyRoute.name)?.({}, createRendererRouteContext(42, 7)) ).resolves.toEqual({ ready: true }) expect(rendererReady).toHaveBeenCalledWith(42) }) @@ -29,7 +30,7 @@ describe('notification routes', () => { await expect( routes.get(notificationAcknowledgePresentationRoute.name)?.( { episodeId: 'episode-1' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ accepted: true }) expect(acknowledgePresentation).toHaveBeenCalledWith('episode-1', 42) @@ -45,9 +46,32 @@ describe('notification routes', () => { await expect( routes.get(notificationAcknowledgePresentationRoute.name)?.( { episodeId: '' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).rejects.toThrow() expect(acknowledgePresentation).not.toHaveBeenCalled() }) + + it('rejects non-renderer callers before invoking renderer ownership services', async () => { + const rendererReady = vi.fn() + const routes = createNotificationRoutes({ + rendererReady, + acknowledgePresentation: vi.fn() + }) + + await expect( + routes.get(notificationRendererReadyRoute.name)?.( + {}, + { + caller: { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['system:read'] + } + } + ) + ).rejects.toThrow('Route requires a renderer caller') + expect(rendererReady).not.toHaveBeenCalled() + }) }) diff --git a/test/main/ocr/routes.test.ts b/test/main/ocr/routes.test.ts index b05b8779fd..71e544d5c9 100644 --- a/test/main/ocr/routes.test.ts +++ b/test/main/ocr/routes.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' +import { createRendererRouteContext } from '@/routes/routeRegistry' import { createOcrRoutes } from '@/ocr/routes' import type { OcrRuntimeServiceStatus } from '@/ocr/ocrRuntimeService' @@ -60,7 +61,7 @@ describe('OCR routes', () => { const routes = createOcrRoutes({ runtime, platform: 'darwin', arch: 'arm64' }) const handler = routes.get('ocr.getRuntimeStatus') - const result = await handler?.({}, { webContentsId: 1, windowId: 1 }) + const result = await handler?.({}, createRendererRouteContext(1, 1)) expect(result).toEqual({ platform: 'darwin', @@ -104,7 +105,7 @@ describe('OCR routes', () => { } const routes = createOcrRoutes({ runtime }) - const result = await routes.get('ocr.clearCache')?.({}, { webContentsId: 1, windowId: null }) + const result = await routes.get('ocr.clearCache')?.({}, createRendererRouteContext(1, null)) expect(runtime.clearCache).toHaveBeenCalledOnce() expect(result).toEqual({ cache: clearedStatus.cache }) @@ -127,7 +128,7 @@ describe('OCR routes', () => { const routes = createOcrRoutes({ runtime, platform: 'win32', arch: 'ia32' }) await expect( - routes.get('ocr.getRuntimeStatus')?.({}, { webContentsId: 1, windowId: null }) + routes.get('ocr.getRuntimeStatus')?.({}, createRendererRouteContext(1, null)) ).resolves.toMatchObject({ platform: 'win32', arch: 'ia32', diff --git a/test/main/orchestration/orchestrationRoutes.test.ts b/test/main/orchestration/orchestrationRoutes.test.ts index 062f35b07c..3b4d283c7a 100644 --- a/test/main/orchestration/orchestrationRoutes.test.ts +++ b/test/main/orchestration/orchestrationRoutes.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' +import { createRendererRouteContext } from '@/routes/routeRegistry' import { orchestrationGetCapabilityRoute, orchestrationInspectLiveDelegationRoute, @@ -9,7 +10,7 @@ import { import { createOrchestrationRoutes } from '@/orchestration/routes' import type { OrchestrationPolicy } from '@shared/orchestration/policy' -const context = { webContentsId: 1, windowId: 1 } +const context = createRendererRouteContext(1, 1) const liveSummary = { schemaVersion: 1 as const, id: 'delegation-1', diff --git a/test/main/provider/providerRuntime.test.ts b/test/main/provider/providerRuntime.test.ts index 592e0299a3..cfeb48cd27 100644 --- a/test/main/provider/providerRuntime.test.ts +++ b/test/main/provider/providerRuntime.test.ts @@ -591,6 +591,53 @@ describe('ProviderRuntime Integration Tests', () => { ) }, 15000) + it('should generate typed audio through the standalone speech runtime', async () => { + mockProviderSettings.getModelConfig = vi.fn().mockReturnValue({ + maxTokens: 4096, + contextLength: 4096, + temperature: 0.4, + vision: false, + functionCall: false, + reasoning: false, + type: ModelType.TTS, + tts: { voice: 'alloy', speed: 1 } + }) + mockRunAiSdkCoreStream.mockImplementationOnce(async function* () { + yield { + type: 'image_data', + image_data: { data: 'data:audio/mpeg;base64,AQID', mimeType: 'audio/mpeg' } + } + yield { type: 'stop', stop_reason: 'complete' } + }) + + const response = await providerRuntime.generateSpeechStandalone( + 'mock-openai-api', + ' Read this aloud. ', + 'gpt-4o-mini-tts', + { speed: 1.25, responseFormat: 'mp3' } + ) + + expect(response).toEqual({ + providerId: 'mock-openai-api', + modelId: 'gpt-4o-mini-tts', + options: { voice: 'alloy', speed: 1.25, responseFormat: 'mp3' }, + audio: { data: 'data:audio/mpeg;base64,AQID', mimeType: 'audio/mpeg' } + }) + expect(mockRunAiSdkCoreStream).toHaveBeenCalledWith( + expect.any(Object), + [{ role: 'user', content: 'Read this aloud.' }], + 'gpt-4o-mini-tts', + expect.objectContaining({ + apiEndpoint: ApiEndpointType.AudioSpeech, + type: ModelType.TTS, + tts: { voice: 'alloy', speed: 1.25, responseFormat: 'mp3' } + }), + 0.4, + 4096, + [] + ) + }, 15000) + it('should summarize titles', async () => { const messages = [ { role: 'user' as const, content: 'Hello, I want to learn about artificial intelligence' }, diff --git a/test/main/provider/routes.test.ts b/test/main/provider/routes.test.ts index b81993e862..a419256fae 100644 --- a/test/main/provider/routes.test.ts +++ b/test/main/provider/routes.test.ts @@ -1,16 +1,19 @@ import { describe, expect, it, vi } from 'vitest' +import { createRendererRouteContext } from '@/routes/routeRegistry' import { createProviderRoutes } from '@/provider/routes' import { modelsGetCapabilitiesRoute, modelsGetProviderCatalogRoute, + modelsSetStatusRoute, providersImportApplyRoute, providersImportScanRoute, providersListSummariesRoute, + providersRemoveRoute, providersUpdateRoute } from '@shared/contracts/routes' import { ModelType } from '@shared/model' -const context = { webContentsId: 42, windowId: 7 } +const context = createRendererRouteContext(42, 7) function createRoutes(deps: { providerSettings: Record @@ -30,6 +33,54 @@ function createRoutes(deps: { } describe('Provider routes', () => { + it('prevents CLI removal of built-in providers', async () => { + const removeProviderAtomic = vi.fn() + const routes = createRoutes({ + providerSettings: { + getProviderById: vi.fn(() => ({ id: 'openai', custom: false })) + }, + providerRuntime: { removeProviderAtomic } + }) + + await expect( + routes.get(providersRemoveRoute.name)?.( + { providerId: 'openai' }, + { + caller: { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['providers:write'] + } + } + ) + ).rejects.toMatchObject({ code: 'conflict' }) + expect(removeProviderAtomic).not.toHaveBeenCalled() + }) + + it('prevents CLI status records for unknown models', async () => { + const updateModelStatus = vi.fn() + const routes = createRoutes({ + providerSettings: { isKnownModel: vi.fn(() => false) }, + providerRuntime: { updateModelStatus } + }) + + await expect( + routes.get(modelsSetStatusRoute.name)?.( + { providerId: 'provider-1', modelId: 'unknown-model', enabled: true }, + { + caller: { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['providers:write'] + } + } + ) + ).rejects.toMatchObject({ code: 'not_found' }) + expect(updateModelStatus).not.toHaveBeenCalled() + }) + it('returns one authoritative capability snapshot and forwards draft route metadata', async () => { const snapshot = { identity: { diff --git a/test/main/routes/dispatcher.test.ts b/test/main/routes/dispatcher.test.ts index 92a3402a6f..61f844d295 100644 --- a/test/main/routes/dispatcher.test.ts +++ b/test/main/routes/dispatcher.test.ts @@ -30,6 +30,7 @@ import { decodeMemoryPageCursor } from '@shared/contracts/routes' import { createRouteDispatcher, dispatchDeepchatRoute } from '@/routes' +import { createRendererRouteContext } from '@/routes/routeRegistry' import { createNodeScheduler } from '@/routes/scheduler' import { ProviderImportService } from '@/provider/providerImportService' import { createProviderRoutes } from '@/provider/routes' @@ -1845,7 +1846,7 @@ function createRuntime() { describe('dispatchDeepchatRoute', () => { it('routes database imports through the App maintenance owner', async () => { const { runtime, appDatabaseMaintenance } = createRuntime() - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteContext(42, 7) await dispatchDeepchatRoute( runtime, @@ -1861,7 +1862,7 @@ describe('dispatchDeepchatRoute', () => { it('routes database security migrations through the App maintenance owner', async () => { const { runtime, appDatabaseMaintenance } = createRuntime() - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteContext(42, 7) await dispatchDeepchatRoute( runtime, @@ -1897,7 +1898,7 @@ describe('dispatchDeepchatRoute', () => { }) await expect( - dispatchDeepchatRoute(runtime, 'sessions.list', {}, { webContentsId: 42, windowId: 7 }) + dispatchDeepchatRoute(runtime, 'sessions.list', {}, createRendererRouteContext(42, 7)) ).rejects.toThrow('maintenance') expect(sessionProjectionPort.listSessions).not.toHaveBeenCalled() @@ -1911,10 +1912,12 @@ describe('dispatchDeepchatRoute', () => { disabledAgentTools: ['read'] } - const result = await dispatchDeepchatRoute(runtime, 'tools.listDefinitions', input, { - webContentsId: 42, - windowId: 7 - }) + const result = await dispatchDeepchatRoute( + runtime, + 'tools.listDefinitions', + input, + createRendererRouteContext(42, 7) + ) expect(result).toMatchObject({ tools: [{ source: 'agent', function: { name: 'read' } }] @@ -1925,10 +1928,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches Cron Jobs routes through the runtime service', async () => { const { runtime, cronJobs } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const listResult = await dispatchDeepchatRoute(runtime, 'cronJobs.list', {}, context) const upsertResult = await dispatchDeepchatRoute( @@ -2109,10 +2109,7 @@ describe('dispatchDeepchatRoute', () => { it('reconciles Cron Jobs after agent mutation routes', async () => { const { runtime, cronJobs } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) await dispatchDeepchatRoute( runtime, @@ -2140,10 +2137,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'startup.getBootstrap', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(projectPresenter.ensureDefaultWorkspace).toHaveBeenCalledTimes(1) @@ -2160,10 +2154,7 @@ describe('dispatchDeepchatRoute', () => { { keys: ['fontSizeLevel', 'fontFamily'] }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(result).toEqual({ @@ -2175,6 +2166,22 @@ describe('dispatchDeepchatRoute', () => { }) }) + it('exposes the same allowlisted settings through the public route', async () => { + const { runtime } = createRuntime() + + await expect( + dispatchDeepchatRoute( + runtime, + 'settings.getPublic', + { keys: ['fontSizeLevel', 'privacyModeEnabled'] }, + createRendererRouteContext(42, 7) + ) + ).resolves.toEqual({ + version: expect.any(Number), + values: { fontSizeLevel: 2, privacyModeEnabled: false } + }) + }) + it('lists system fonts through the settings handler adapter', async () => { const { runtime, fontSettings } = createRuntime() @@ -2182,10 +2189,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'settings.listSystemFonts', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(fontSettings.getSystemFonts).toHaveBeenCalledTimes(1) @@ -2228,7 +2232,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listAuditEvents', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(listByAgent).toHaveBeenCalledWith( @@ -2273,7 +2277,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listAuditEvents', { agentId: 'deleted' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ events: [] }) await expect( @@ -2281,7 +2285,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listAuditEvents', { agentId: 'acp-agent' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ events: [] }) expect(listByAgent).not.toHaveBeenCalled() @@ -2324,7 +2328,7 @@ describe('dispatchDeepchatRoute', () => { deleteDirectiveResult } - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteContext(42, 7) const listed = await dispatchDeepchatRoute( runtime, 'memory.listDirectives', @@ -2405,7 +2409,7 @@ describe('dispatchDeepchatRoute', () => { rejectDirectiveResult, deleteDirectiveResult } - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteContext(42, 7) await expect( dispatchDeepchatRoute( @@ -2466,7 +2470,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getHealth', { agentId: 'other' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ health: createEmptyMemoryHealth() }) expect(getHealth).not.toHaveBeenCalled() @@ -2477,7 +2481,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getHealth', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ health }) expect(getHealth).toHaveBeenCalledWith('deepchat') @@ -2553,7 +2557,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getLifecycle', { agentId: 'other', memoryId: 'm1' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ lifecycle: null }) expect(getLifecycle).not.toHaveBeenCalled() @@ -2564,7 +2568,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getLifecycle', { agentId: 'deepchat', memoryId: 'm1' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ lifecycle }) expect(getLifecycle).toHaveBeenCalledWith('deepchat', 'm1') @@ -2574,7 +2578,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getArchiveCandidateLifecyclePreview', { agentId: 'other' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ preview: createEmptyArchiveCandidateLifecyclePreview() }) expect(getArchiveCandidateLifecyclePreview).not.toHaveBeenCalled() @@ -2585,7 +2589,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getArchiveCandidateLifecyclePreview', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ preview }) expect(getArchiveCandidateLifecyclePreview).toHaveBeenCalledWith('deepchat') @@ -2599,7 +2603,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listAuditEvents', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ events: [] }) }) @@ -2635,7 +2639,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listViewManifests', { agentId: 'a', sessionId: 's1', messageId: 'msg-old', limit: 1 }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(listSessions).not.toHaveBeenCalled() @@ -2680,7 +2684,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listViewManifests', { agentId: 'deepchat', sessionId: 's1', messageId: 'msg-1', limit: 1 }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(result).toEqual({ @@ -2723,7 +2727,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getSourceSpan', { agentId: 'deepchat', memoryId: 'memory-1' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(getEffectiveMessageSourceSpan).toHaveBeenCalledWith('s1', [2, 3]) @@ -2805,7 +2809,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getByIds', { agentId: 'other', memoryIds: ['m1'] }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(guarded).toEqual({ memories: [] }) expect(getByIds).not.toHaveBeenCalled() @@ -2814,7 +2818,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.getByIds', { agentId: 'deepchat', memoryIds: ['m2', 'm1'] }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(getByIds).toHaveBeenCalledWith('deepchat', ['m2', 'm1']) @@ -2846,7 +2850,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.archive', { agentId: 'other', memoryId: 'm1' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ action: 'rejected', reason: 'unavailable' }) expect(archiveUserMemory).not.toHaveBeenCalled() @@ -2856,7 +2860,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.archive', { agentId: 'deepchat', memoryId: 'm1' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ action: 'applied' }) expect(archiveUserMemory).toHaveBeenCalledWith('deepchat', 'm1') @@ -2874,7 +2878,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.reindex', { agentId: 'other' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ started: false }) expect(canReindex).not.toHaveBeenCalled() @@ -2886,7 +2890,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.reindex', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ started: false }) expect(canReindex).toHaveBeenCalledWith('deepchat') @@ -2899,7 +2903,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.reindex', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ started: false }) expect(reindexEmbeddings).toHaveBeenCalledTimes(1) @@ -2911,7 +2915,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.reindex', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ started: true }) expect(reindexEmbeddings).toHaveBeenCalledTimes(2) @@ -2922,7 +2926,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.reindex', { agentId: 'deepchat' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ started: false }) expect(reindexEmbeddings).toHaveBeenCalledTimes(2) @@ -2940,7 +2944,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listViewManifests', { agentId: 'deleted' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ manifests: [] }) await expect( @@ -2948,7 +2952,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listViewManifests', { agentId: 'acp-agent' }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ manifests: [] }) expect(listMemoryViewManifestsByAgent).not.toHaveBeenCalled() @@ -2998,7 +3002,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.page', { agentId: 'deepchat', limit: 25 }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(pageMemories).toHaveBeenCalledWith('deepchat', null, 25) @@ -3022,7 +3026,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.page', { agentId: 'external-agent', limit: 25 }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) ).resolves.toEqual({ items: [], nextCursor: null }) expect(pageMemories).not.toHaveBeenCalled() @@ -3061,7 +3065,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'memory.listViewManifests', { agentId: 'a', limit: 100 }, - { webContentsId: 42, windowId: 7 } + createRendererRouteContext(42, 7) ) expect(listSessions).not.toHaveBeenCalled() @@ -3077,10 +3081,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches ACP terminal command routes through the terminal helper', async () => { const { runtime } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const inputResult = await dispatchDeepchatRoute( runtime, @@ -3098,10 +3099,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches shortcut routes through ShortcutPresenter', async () => { const { runtime, shortcutPresenter } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const registerResult = await dispatchDeepchatRoute(runtime, 'shortcut.register', {}, context) const unregisterResult = await dispatchDeepchatRoute( @@ -3145,10 +3143,7 @@ describe('dispatchDeepchatRoute', () => { { key: 'ocrBackend', value: 'cpu' } ] }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(desktopSettings.setFontSizeLevel).toHaveBeenCalledWith(4) @@ -3189,6 +3184,38 @@ describe('dispatchDeepchatRoute', () => { }) }) + it('limits each public settings mutation to one typed change', async () => { + const { runtime, settings } = createRuntime() + const context = createRendererRouteContext(42, 7) + + await expect( + dispatchDeepchatRoute( + runtime, + 'settings.updatePublic', + { changes: [{ key: 'fontSizeLevel', value: 3 }] }, + context + ) + ).resolves.toMatchObject({ + changedKeys: ['fontSizeLevel'], + values: { fontSizeLevel: 3 } + }) + await expect( + dispatchDeepchatRoute( + runtime, + 'settings.updatePublic', + { + changes: [ + { key: 'fontSizeLevel', value: 4 }, + { key: 'privacyModeEnabled', value: true } + ] + }, + context + ) + ).rejects.toThrow() + expect(settings.fontSizeLevel).toBe(3) + expect(settings.privacyModeEnabled).toBe(false) + }) + it('dispatches built-in knowledge config routes through KnowledgeSettings', async () => { const { runtime, providerSettings } = createRuntime() const nextConfigs = [ @@ -3217,10 +3244,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'config.getKnowledgeConfigs', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const setResult = await dispatchDeepchatRoute( runtime, @@ -3228,10 +3252,7 @@ describe('dispatchDeepchatRoute', () => { { configs: nextConfigs }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(getResult).toEqual({ @@ -3248,10 +3269,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches knowledge file routes through KnowledgeService', async () => { const { runtime, knowledgeService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const supportedResult = await dispatchDeepchatRoute( runtime, @@ -3372,10 +3390,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches skill sync routes through SkillSyncService', async () => { const { runtime, skillSyncService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const scanResult = await dispatchDeepchatRoute( runtime, 'skillSync.scanExternalTools', @@ -3418,10 +3433,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches GitHub Copilot OAuth routes through OAuthService', async () => { const { runtime, oauthService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const loginResult = await dispatchDeepchatRoute( runtime, @@ -3444,10 +3456,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches OpenAI Codex OAuth routes through OAuthService', async () => { const { runtime, oauthService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const statusResult = await dispatchDeepchatRoute( runtime, @@ -3486,10 +3495,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches database schema repair through MainDatabase', async () => { const { runtime, sqlitePresenter } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const repairResult = await dispatchDeepchatRoute( runtime, @@ -3510,10 +3516,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches NowledgeMem routes through ConversationExporter', async () => { const { runtime, exporter } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const getResult = await dispatchDeepchatRoute(runtime, 'nowledgeMem.getConfig', {}, context) const updateResult = await dispatchDeepchatRoute( @@ -3576,10 +3579,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches scoped skill script requests through SkillService', async () => { const { runtime, skillService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) ;(skillService as any).listSkillScriptsForAgent = vi.fn().mockResolvedValue([]) const result = await dispatchDeepchatRoute( @@ -3598,10 +3598,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches Agent Skill import source discovery', async () => { const { runtime, skillSyncService, providerSettings } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const result = await dispatchDeepchatRoute( runtime, @@ -3626,10 +3623,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches skill file reads through SkillService', async () => { const { runtime, skillService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const result = await dispatchDeepchatRoute( runtime, @@ -3646,10 +3640,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches MCP Router marketplace routes through McpService', async () => { const { runtime, mcpService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const listResult = await dispatchDeepchatRoute( runtime, @@ -3722,7 +3713,7 @@ describe('dispatchDeepchatRoute', () => { it('returns typed MCP add results and records only persisted additions', async () => { const { runtime, mcpService, sqlitePresenter } = createRuntime() - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteContext(42, 7) const config = { type: 'stdio', command: 'node', @@ -3754,7 +3745,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches NPM registry routes through McpService', async () => { const { runtime, mcpService } = createRuntime() - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteContext(42, 7) await dispatchDeepchatRoute(runtime, 'mcp.getNpmRegistryStatus', {}, context) await dispatchDeepchatRoute(runtime, 'mcp.refreshNpmRegistry', {}, context) @@ -3781,10 +3772,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches remote control routes through RemoteService', async () => { const { runtime, remoteService } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) await dispatchDeepchatRoute(runtime, 'remoteControl.listChannels', {}, context) await dispatchDeepchatRoute( @@ -3932,10 +3920,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches DeepChat agent config routes through AgentSettings', async () => { const { runtime, providerSettings } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const listResult = await dispatchDeepchatRoute( runtime, @@ -4027,10 +4012,7 @@ describe('dispatchDeepchatRoute', () => { skillSettings, testHookCommand } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const initialProxy = await dispatchDeepchatRoute( runtime, @@ -4212,10 +4194,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches ACP config routes through AgentSettings', async () => { const { runtime, providerSettings } = createRuntime() - const context = { - webContentsId: 42, - windowId: 7 - } + const context = createRendererRouteContext(42, 7) const setEnabledResult = await dispatchDeepchatRoute( runtime, @@ -4336,10 +4315,7 @@ describe('dispatchDeepchatRoute', () => { agentId: 'deepchat', message: 'hello world' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionLifecyclePort.createSession).toHaveBeenCalledWith( @@ -4362,10 +4338,7 @@ describe('dispatchDeepchatRoute', () => { sessionId: 'session-1', content: 'follow up' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionTurnPort.sendMessage).toHaveBeenCalledWith('session-1', 'follow up', { @@ -4379,10 +4352,7 @@ describe('dispatchDeepchatRoute', () => { sessionId: 'session-1', content: 'refine the active answer' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionTurnPort.steerActiveTurn).toHaveBeenCalledWith( @@ -4397,10 +4367,7 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionTurnPort.compactSession).toHaveBeenCalledWith('session-1') @@ -4421,10 +4388,7 @@ describe('dispatchDeepchatRoute', () => { messageId: 'message-1', attachmentFallbackPolicy: 'send_without_image_content' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionTurnPort.retryMessage).toHaveBeenCalledWith('session-1', 'message-1', { @@ -4446,7 +4410,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'sessions.retryMessage', { sessionId: 'session-1', messageId: 'message-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) expect(sessionTurnPort.retryMessage).toHaveBeenLastCalledWith('session-1', 'message-1') @@ -4491,7 +4455,7 @@ describe('dispatchDeepchatRoute', () => { }, submissionId: 'submission-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) await started @@ -4500,7 +4464,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'chat.cancelSubmission', { submissionId: 'submission-1' }, - { webContentsId: 99, windowId: 4 } + createRendererRouteContext(99, 4) ) ).resolves.toEqual({ cancelled: false }) expect(acceptanceSignal?.aborted).toBe(false) @@ -4510,7 +4474,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'chat.cancelSubmission', { submissionId: 'submission-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) ).resolves.toEqual({ cancelled: true }) await expect(pendingSend).rejects.toMatchObject({ name: 'AbortError' }) @@ -4521,7 +4485,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'chat.cancelSubmission', { submissionId: 'submission-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) ).resolves.toEqual({ cancelled: false }) }) @@ -4562,7 +4526,7 @@ describe('dispatchDeepchatRoute', () => { }, submissionId: 'steer-submission-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) await started @@ -4571,7 +4535,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'chat.cancelSubmission', { submissionId: 'steer-submission-1' }, - { webContentsId: 99, windowId: 4 } + createRendererRouteContext(99, 4) ) ).resolves.toEqual({ cancelled: false }) expect(acceptanceSignal?.aborted).toBe(false) @@ -4581,7 +4545,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'chat.cancelSubmission', { submissionId: 'steer-submission-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) ).resolves.toEqual({ cancelled: true }) await expect(pendingSteer).rejects.toMatchObject({ name: 'AbortError' }) @@ -4592,7 +4556,7 @@ describe('dispatchDeepchatRoute', () => { runtime, 'chat.cancelSubmission', { submissionId: 'steer-submission-1' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) ).resolves.toEqual({ cancelled: false }) }) @@ -4609,10 +4573,7 @@ describe('dispatchDeepchatRoute', () => { timeout: 5000 } }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const getResult = await dispatchDeepchatRoute( @@ -4621,10 +4582,7 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionAssignmentPort.updateSessionGenerationSettings).toHaveBeenCalledWith( @@ -4656,10 +4614,7 @@ describe('dispatchDeepchatRoute', () => { it('dispatches dashboard maintenance routes through explicit owners', async () => { const { runtime, providerSettings, usageStatsService, rtkRuntimeService } = createRuntime() - const context = { - webContentsId: 88, - windowId: 3 - } + const context = createRendererRouteContext(88, 3) const agentsResult = await dispatchDeepchatRoute(runtime, 'sessions.getAgents', {}, context) const dashboardResult = await dispatchDeepchatRoute( @@ -4698,7 +4653,7 @@ describe('dispatchDeepchatRoute', () => { agentSessionExportService, providerSettings } = createRuntime() - const context = { webContentsId: 88, windowId: 3 } + const context = createRendererRouteContext(88, 3) await dispatchDeepchatRoute( runtime, @@ -4779,10 +4734,7 @@ describe('dispatchDeepchatRoute', () => { { providerId: 'openai' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const checkResult = await dispatchDeepchatRoute( @@ -4792,10 +4744,7 @@ describe('dispatchDeepchatRoute', () => { providerId: 'openai', modelId: 'gpt-5.4' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const keyStatusResult = await dispatchDeepchatRoute( @@ -4804,10 +4753,7 @@ describe('dispatchDeepchatRoute', () => { { providerId: 'openai' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const rateLimitStatusResult = await dispatchDeepchatRoute( @@ -4816,10 +4762,7 @@ describe('dispatchDeepchatRoute', () => { { providerId: 'openai' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const updateRateLimitResult = await dispatchDeepchatRoute( @@ -4830,10 +4773,7 @@ describe('dispatchDeepchatRoute', () => { enabled: true, qpsLimit: 2 }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const embeddingDimensionsResult = await dispatchDeepchatRoute( @@ -4843,10 +4783,7 @@ describe('dispatchDeepchatRoute', () => { providerId: 'openai', modelId: 'text-embedding-3-small' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const modelScopeSyncResult = await dispatchDeepchatRoute( @@ -4859,10 +4796,7 @@ describe('dispatchDeepchatRoute', () => { page_size: 50 } }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const acpDebugResult = await dispatchDeepchatRoute( @@ -4874,23 +4808,20 @@ describe('dispatchDeepchatRoute', () => { action: 'initialize', payload: {} }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const acpWarmupResult = await dispatchDeepchatRoute( runtime, 'providers.warmupAcpProcess', { agentId: 'codex-acp', workdir: '/repo' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) const acpConfigResult = await dispatchDeepchatRoute( runtime, 'providers.getAcpProcessConfigOptions', { agentId: 'codex-acp', workdir: '/repo' }, - { webContentsId: 88, windowId: 3 } + createRendererRouteContext(88, 3) ) const interactionResult = await dispatchDeepchatRoute( @@ -4905,10 +4836,7 @@ describe('dispatchDeepchatRoute', () => { granted: true } }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(providerSettings.getProviderModels).toHaveBeenCalledWith('openai') @@ -5051,30 +4979,21 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const deactivateResult = await dispatchDeepchatRoute( runtime, 'sessions.deactivate', {}, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const activeResult = await dispatchDeepchatRoute( runtime, 'sessions.getActive', {}, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(desktopSessionBinding.activate).toHaveBeenCalledWith(88, 'session-1') @@ -5099,10 +5018,7 @@ describe('dispatchDeepchatRoute', () => { { requestId: 'message-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(sessionProjectionPort.getMessage).toHaveBeenCalledWith('message-1') @@ -5118,30 +5034,21 @@ describe('dispatchDeepchatRoute', () => { runtime, 'window.getCurrentState', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const minimizedState = await dispatchDeepchatRoute( runtime, 'window.minimizeCurrent', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const maximizedState = await dispatchDeepchatRoute( runtime, 'window.toggleMaximizeCurrent', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const previewResult = await dispatchDeepchatRoute( @@ -5150,70 +5057,49 @@ describe('dispatchDeepchatRoute', () => { { filePath: 'C:/workspace/README.md' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const closeFloatingResult = await dispatchDeepchatRoute( runtime, 'window.closeFloatingCurrent', {}, - { - webContentsId: 444, - windowId: 7 - } + createRendererRouteContext(444, 7) ) const closeResult = await dispatchDeepchatRoute( runtime, 'window.closeCurrent', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const closeSettingsResult = await dispatchDeepchatRoute( runtime, 'window.closeSettings', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const focusMainResult = await dispatchDeepchatRoute( runtime, 'window.focusMain', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const notifySettingsReadyResult = await dispatchDeepchatRoute( runtime, 'window.notifySettingsReady', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const pendingProviderInstallResult = await dispatchDeepchatRoute( runtime, 'window.consumePendingSettingsProviderInstall', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const requeueProviderInstallResult = await dispatchDeepchatRoute( @@ -5222,20 +5108,14 @@ describe('dispatchDeepchatRoute', () => { { preview: pendingProviderInstallResult.preview }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const startGuidedOnboardingResult = await dispatchDeepchatRoute( runtime, 'window.startGuidedOnboarding', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(initialState).toEqual({ @@ -5317,28 +5197,19 @@ describe('dispatchDeepchatRoute', () => { runtime, 'device.getAppVersion', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const deviceInfo = await dispatchDeepchatRoute( runtime, 'device.getInfo', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const directorySelection = await dispatchDeepchatRoute( runtime, 'device.selectDirectory', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const fileSelection = await dispatchDeepchatRoute( runtime, @@ -5346,19 +5217,13 @@ describe('dispatchDeepchatRoute', () => { { filters: [{ name: 'ZIP Files', extensions: ['zip'] }] }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const restartResult = await dispatchDeepchatRoute( runtime, 'device.restartApp', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const resetDataResult = await dispatchDeepchatRoute( runtime, @@ -5366,10 +5231,7 @@ describe('dispatchDeepchatRoute', () => { { resetType: 'chat' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const sanitizeResult = await dispatchDeepchatRoute( runtime, @@ -5377,10 +5239,7 @@ describe('dispatchDeepchatRoute', () => { { svgContent: '' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const recentProjects = await dispatchDeepchatRoute( @@ -5389,19 +5248,13 @@ describe('dispatchDeepchatRoute', () => { { limit: 5 }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const environments = await dispatchDeepchatRoute( runtime, 'project.listEnvironments', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const reorderEnvironmentsResult = await dispatchDeepchatRoute( runtime, @@ -5409,10 +5262,7 @@ describe('dispatchDeepchatRoute', () => { { paths: ['C:/workspace', 'C:/other'] }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const archiveEnvironmentResult = await dispatchDeepchatRoute( runtime, @@ -5420,10 +5270,7 @@ describe('dispatchDeepchatRoute', () => { { path: 'C:/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const restoreEnvironmentResult = await dispatchDeepchatRoute( runtime, @@ -5431,10 +5278,7 @@ describe('dispatchDeepchatRoute', () => { { path: 'C:/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const removeEnvironmentResult = await dispatchDeepchatRoute( runtime, @@ -5442,10 +5286,7 @@ describe('dispatchDeepchatRoute', () => { { path: 'C:/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const openDirectoryResult = await dispatchDeepchatRoute( runtime, @@ -5453,10 +5294,7 @@ describe('dispatchDeepchatRoute', () => { { path: 'C:/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const pathExistsResult = await dispatchDeepchatRoute( runtime, @@ -5464,19 +5302,13 @@ describe('dispatchDeepchatRoute', () => { { path: 'C:/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const selectedDirectory = await dispatchDeepchatRoute( runtime, 'project.selectDirectory', {}, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const mimeType = await dispatchDeepchatRoute( @@ -5485,10 +5317,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace/demo.txt' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const preparedFile = await dispatchDeepchatRoute( runtime, @@ -5497,10 +5326,7 @@ describe('dispatchDeepchatRoute', () => { path: '/workspace/demo.txt', mimeType: 'text/plain' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const preparedDirectory = await dispatchDeepchatRoute( runtime, @@ -5508,10 +5334,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const readFile = await dispatchDeepchatRoute( runtime, @@ -5519,10 +5342,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace/demo.txt' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const isDirectory = await dispatchDeepchatRoute( runtime, @@ -5530,10 +5350,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const imagePath = await dispatchDeepchatRoute( runtime, @@ -5542,10 +5359,7 @@ describe('dispatchDeepchatRoute', () => { name: 'capture.png', content: 'data:image/png;base64,abc' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const registerWorkspace = await dispatchDeepchatRoute( @@ -5555,10 +5369,7 @@ describe('dispatchDeepchatRoute', () => { workspacePath: '/workspace', mode: 'workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const registerWorkdir = await dispatchDeepchatRoute( runtime, @@ -5567,10 +5378,7 @@ describe('dispatchDeepchatRoute', () => { workspacePath: '/workspace', mode: 'workdir' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const readDirectory = await dispatchDeepchatRoute( runtime, @@ -5578,10 +5386,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const preview = await dispatchDeepchatRoute( runtime, @@ -5589,10 +5394,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace/src/app.ts' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const gitStatus = await dispatchDeepchatRoute( runtime, @@ -5600,10 +5402,7 @@ describe('dispatchDeepchatRoute', () => { { workspacePath: '/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const gitDiff = await dispatchDeepchatRoute( runtime, @@ -5612,10 +5411,7 @@ describe('dispatchDeepchatRoute', () => { workspacePath: '/workspace', filePath: '/workspace/src/app.ts' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const resolution = await dispatchDeepchatRoute( runtime, @@ -5625,10 +5421,7 @@ describe('dispatchDeepchatRoute', () => { href: './docs/guide.md', sourceFilePath: '/workspace/README.md' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const searchResult = await dispatchDeepchatRoute( runtime, @@ -5637,10 +5430,7 @@ describe('dispatchDeepchatRoute', () => { workspacePath: '/workspace', query: 'app' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const openFileResult = await dispatchDeepchatRoute( runtime, @@ -5648,10 +5438,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace/src/app.ts' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const revealResult = await dispatchDeepchatRoute( runtime, @@ -5659,10 +5446,7 @@ describe('dispatchDeepchatRoute', () => { { path: '/workspace/src/app.ts' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const unwatchResult = await dispatchDeepchatRoute( runtime, @@ -5670,10 +5454,7 @@ describe('dispatchDeepchatRoute', () => { { workspacePath: '/workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) const unregisterResult = await dispatchDeepchatRoute( runtime, @@ -5682,10 +5463,7 @@ describe('dispatchDeepchatRoute', () => { workspacePath: '/workspace', mode: 'workspace' }, - { - webContentsId: 42, - windowId: 7 - } + createRendererRouteContext(42, 7) ) expect(deviceService.getAppVersion).toHaveBeenCalledTimes(1) @@ -5857,10 +5635,7 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const loadResult = await dispatchDeepchatRoute( runtime, @@ -5870,10 +5645,7 @@ describe('dispatchDeepchatRoute', () => { url: 'https://example.com/docs', timeoutMs: 5000 }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const attachResult = await dispatchDeepchatRoute( runtime, @@ -5881,10 +5653,7 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const updateResult = await dispatchDeepchatRoute( runtime, @@ -5899,10 +5668,7 @@ describe('dispatchDeepchatRoute', () => { }, visible: true }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const backResult = await dispatchDeepchatRoute( runtime, @@ -5910,10 +5676,7 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const detachResult = await dispatchDeepchatRoute( runtime, @@ -5921,10 +5684,7 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const destroyResult = await dispatchDeepchatRoute( runtime, @@ -5932,19 +5692,13 @@ describe('dispatchDeepchatRoute', () => { { sessionId: 'session-1' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const clearSandboxResult = await dispatchDeepchatRoute( runtime, 'browser.clearSandboxData', {}, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(statusResult).toEqual({ @@ -5998,7 +5752,7 @@ describe('dispatchDeepchatRoute', () => { it('scopes Computer Use preview routes to the active sender session', async () => { const { runtime, computerUsePreviewPresenter, desktopSessionBinding, yoBrowserPresenter } = createRuntime() - const context = { webContentsId: 88, windowId: 3 } + const context = createRendererRouteContext(88, 3) desktopSessionBinding.getActiveId.mockReturnValue('session-1') const eligible = await dispatchDeepchatRoute( @@ -6069,10 +5823,7 @@ describe('dispatchDeepchatRoute', () => { height: 80 } }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) const stitchResult = await dispatchDeepchatRoute( runtime, @@ -6087,10 +5838,7 @@ describe('dispatchDeepchatRoute', () => { } } }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(tabPresenter.captureTabArea).toHaveBeenCalledWith(88, { @@ -6127,10 +5875,7 @@ describe('dispatchDeepchatRoute', () => { routeName: 'settings-display', section: 'fonts' }, - { - webContentsId: 88, - windowId: 3 - } + createRendererRouteContext(88, 3) ) expect(windowPresenter.createSettingsWindow).toHaveBeenCalledWith({ diff --git a/test/main/routes/routeRegistry.test.ts b/test/main/routes/routeRegistry.test.ts new file mode 100644 index 0000000000..62fb62efe7 --- /dev/null +++ b/test/main/routes/routeRegistry.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, it } from 'vitest' +import { + createRendererRouteCaller, + createRendererRouteContext, + requireRendererCaller, + type RouteContext +} from '@/routes/routeRegistry' + +describe('route caller context', () => { + it('wraps renderer identity in a discriminated caller', () => { + const caller = createRendererRouteCaller(42, 7) + + expect(caller).toEqual({ + kind: 'renderer', + webContentsId: 42, + windowId: 7 + }) + expect(createRendererRouteContext(42, null)).toEqual({ + caller: { + kind: 'renderer', + webContentsId: 42, + windowId: null + } + }) + }) + + it('returns renderer identity at renderer boundaries', () => { + const context = createRendererRouteContext(42, 7) + + expect(requireRendererCaller(context)).toBe(context.caller) + }) + + it.each([ + { + caller: { + kind: 'cli', + principal: 'human', + connectionId: 'connection-1', + scopes: ['system:read'] + } + }, + { + caller: { + kind: 'cli', + principal: 'agent', + connectionId: 'connection-2', + tokenId: 'token-id-session-1', + scopes: ['models:invoke'], + conversationId: 'session-1', + expiresAt: Date.now() + 60_000 + } + }, + { + caller: { + kind: 'internal', + component: 'scheduler' + } + } + ])('rejects non-renderer identity %# at renderer boundaries', (context) => { + expect(() => requireRendererCaller(context)).toThrow('Route requires a renderer caller') + }) +}) diff --git a/test/main/scripts/buildCli.test.ts b/test/main/scripts/buildCli.test.ts new file mode 100644 index 0000000000..2087718756 --- /dev/null +++ b/test/main/scripts/buildCli.test.ts @@ -0,0 +1,95 @@ +import { execFile } from 'node:child_process' +import { copyFile, mkdir, mkdtemp, readFile, rm, stat, symlink } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { promisify } from 'node:util' +import { describe, expect, it } from 'vitest' +import { parse } from 'yaml' +import { + POSIX_LAUNCHER, + WINDOWS_LAUNCHER, + buildCli +} from '../../../scripts/build-cli.mjs' + +const execFileAsync = promisify(execFile) +const CLI_BUILD_TEST_TIMEOUT_MS = 30_000 + +async function runGeneratedLauncher(outputDirectory: string) { + if (process.platform === 'win32') { + const launcherPath = path.join(outputDirectory, 'deepchat.cmd') + return await execFileAsync( + process.env.ComSpec ?? 'cmd.exe', + ['/d', '/s', '/c', `"${launcherPath}" help`], + { env: { ...process.env, PATH: '' } } + ) + } + return await execFileAsync(path.join(outputDirectory, 'deepchat'), ['help'], { + env: { ...process.env, PATH: '' } + }) +} + +async function provisionBundledRuntime(outputDirectory: string): Promise { + const runtimeNode = path.resolve( + outputDirectory, + '..', + 'runtime', + 'node', + process.platform === 'win32' ? 'node.exe' : path.join('bin', 'node') + ) + await mkdir(path.dirname(runtimeNode), { recursive: true }) + if (process.platform === 'win32') { + await copyFile(process.execPath, runtimeNode) + } else { + await symlink(process.execPath, runtimeNode) + } +} + +describe('CLI bundle', () => { + it('builds a standalone Node entry and explicit bundled-runtime launchers', async () => { + const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-cli-build-')) + const outputDirectory = path.join(temporaryDirectory, 'cli') + try { + await buildCli({ outDir: outputDirectory, logLevel: 'silent' }) + await provisionBundledRuntime(outputDirectory) + const entryPath = path.join(outputDirectory, 'deepchat.mjs') + const source = await readFile(entryPath, 'utf8') + const result = await execFileAsync(process.execPath, [entryPath, 'help']) + const launcherResult = await runGeneratedLauncher(outputDirectory) + + expect(source.startsWith('#!/usr/bin/env node')).toBe(true) + expect(source).not.toMatch(/from\s+["']zod["']/) + expect(result.stdout).toContain('deepchat ') + expect(launcherResult.stdout).toContain('deepchat ') + if (process.platform !== 'win32') { + expect((await stat(path.join(outputDirectory, 'deepchat'))).mode & 0o111).toBe(0o111) + } + expect(await readFile(path.join(outputDirectory, 'deepchat'), 'utf8')).toBe(POSIX_LAUNCHER) + expect(await readFile(path.join(outputDirectory, 'deepchat.cmd'), 'utf8')).toBe( + WINDOWS_LAUNCHER + ) + expect(POSIX_LAUNCHER).toContain('../runtime/node/bin/node') + expect(POSIX_LAUNCHER).toContain('../../runtime/node/bin/node') + expect(POSIX_LAUNCHER).not.toContain('command -v node') + expect(WINDOWS_LAUNCHER).toContain('..\\runtime\\node\\node.exe') + expect(WINDOWS_LAUNCHER).toContain('..\\..\\runtime\\node\\node.exe') + expect(WINDOWS_LAUNCHER).not.toContain('where node') + expect(WINDOWS_LAUNCHER).not.toContain('node "%~dp0deepchat.mjs"') + } finally { + await rm(temporaryDirectory, { recursive: true }) + } + }, CLI_BUILD_TEST_TIMEOUT_MS) + + it('packages only generated CLI resources outside app.asar', async () => { + const config = parse(await readFile(path.resolve('electron-builder.yml'), 'utf8')) as { + files: string[] + extraResources: Array<{ from: string; to: string; filter?: string[] }> + } + + expect(config.files).toContain('!out/cli/**') + expect(config.extraResources).toContainEqual({ + from: './out/cli/', + to: 'app.asar.unpacked/cli', + filter: ['deepchat', 'deepchat.cmd', 'deepchat.mjs'] + }) + }) +}) diff --git a/test/main/session/data/tables/deepchatSessionMetadata.test.ts b/test/main/session/data/tables/deepchatSessionMetadata.test.ts new file mode 100644 index 0000000000..2f4b3e81af --- /dev/null +++ b/test/main/session/data/tables/deepchatSessionMetadata.test.ts @@ -0,0 +1,56 @@ +import { afterEach, beforeEach, expect, it } from 'vitest' +import { Database, nativeSqliteDescribeIf } from '../../../nativeSqliteHarness' + +const sqliteModule = await import('better-sqlite3-multiple-ciphers').catch(() => null) +const tableModule = sqliteModule + ? await import('@/session/data/tables/deepchatSessionMetadata').catch(() => null) + : null +const DeepChatSessionMetadataTable = tableModule?.DeepChatSessionMetadataTable +const DatabaseCtor = Database! +const TableCtor = DeepChatSessionMetadataTable! +const describeIfSqlite = nativeSqliteDescribeIf( + Boolean(DeepChatSessionMetadataTable), + 'Session metadata native table module is unavailable' +) + +describeIfSqlite('DeepChatSessionMetadataTable', () => { + let db: InstanceType | null + let table: InstanceType + + beforeEach(() => { + db = new DatabaseCtor(':memory:') + table = new TableCtor(db) + table.createTable() + }) + + afterEach(() => { + db?.close() + db = null + }) + + it('round-trips CLI run ownership without adding a second run table', () => { + table.upsert('session-1', { source: 'cli_run' }, 123) + + expect(table.get('session-1')).toEqual({ source: 'cli_run' }) + }) + + it('preserves scheduled-run metadata compatibility', () => { + table.upsert( + 'session-1', + { + source: 'cron_job', + cronJobId: 'job-1', + cronJobRunId: 'job-run-1', + scheduledAt: 100 + }, + 123 + ) + + expect(table.get('session-1')).toEqual({ + source: 'cron_job', + cronJobId: 'job-1', + cronJobRunId: 'job-run-1', + scheduledAt: 100 + }) + }) +}) diff --git a/test/main/session/sessionService.test.ts b/test/main/session/sessionService.test.ts index 2d118e8175..779f632e2c 100644 --- a/test/main/session/sessionService.test.ts +++ b/test/main/session/sessionService.test.ts @@ -1,4 +1,5 @@ import { SessionService } from '@/session/sessionService' +import { createRendererRouteCaller } from '@/routes/routeRegistry' describe('SessionService', () => { const createScheduler = () => ({ @@ -134,7 +135,7 @@ describe('SessionService', () => { getActive: vi.fn().mockResolvedValue(session) } const service = new SessionService({ lifecycle, projection, desktop, scheduler }) - const context = { webContentsId: 42, windowId: 7 } + const context = createRendererRouteCaller(42, 7) const input = { agentId: 'deepchat', message: 'hello' } const filters = { agentId: 'deepchat' } const pageOptions = { limit: 20, cursor: null } diff --git a/test/main/shared/filesystem.test.ts b/test/main/shared/filesystem.test.ts new file mode 100644 index 0000000000..7043d9474f --- /dev/null +++ b/test/main/shared/filesystem.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest' +import { isHardlinkUnavailableError } from '@shared/utils/filesystem' + +describe('filesystem utilities', () => { + it('recognizes hardlink capability errors without assuming an Error object', () => { + expect(isHardlinkUnavailableError(null)).toBe(false) + expect(isHardlinkUnavailableError(undefined)).toBe(false) + expect(isHardlinkUnavailableError('EPERM')).toBe(false) + expect( + isHardlinkUnavailableError(Object.assign(new Error('unsupported'), { code: 'EPERM' })) + ).toBe(true) + expect(isHardlinkUnavailableError({ code: 'EPERM' })).toBe(true) + expect( + isHardlinkUnavailableError(Object.assign(new Error('missing'), { code: 'ENOENT' })) + ).toBe(false) + }) +}) diff --git a/test/main/skill/archive.test.ts b/test/main/skill/archive.test.ts new file mode 100644 index 0000000000..59b5d594a2 --- /dev/null +++ b/test/main/skill/archive.test.ts @@ -0,0 +1,160 @@ +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { strToU8, zipSync } from 'fflate' +import { extractSkillArchive } from '@/skill/archive' + +vi.unmock('fs') +vi.unmock('node:fs') +vi.unmock('path') +vi.unmock('node:path') + +const temporaryDirectories: string[] = [] + +function createTemporaryDirectory(): string { + const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'deepchat-skill-archive-test-')) + temporaryDirectories.push(directory) + return directory +} + +function writeArchive(directory: string, entries: Record): string { + const archivePath = path.join(directory, 'skill.zip') + fs.writeFileSync(archivePath, zipSync(entries, { level: 9 })) + return archivePath +} + +afterEach(() => { + for (const directory of temporaryDirectories.splice(0)) { + fs.rmSync(directory, { recursive: true, force: true }) + } +}) + +describe('extractSkillArchive', () => { + it('streams regular files into the target directory', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'example/SKILL.md': strToU8('# Example'), + 'example/scripts/run.js': strToU8("console.log('ok')") + }) + const target = path.join(root, 'target') + + await extractSkillArchive(archivePath, target) + + expect(fs.readFileSync(path.join(target, 'example', 'SKILL.md'), 'utf8')).toBe('# Example') + expect(fs.readFileSync(path.join(target, 'example', 'scripts', 'run.js'), 'utf8')).toBe( + "console.log('ok')" + ) + }) + + it('rejects traversal without writing outside the target', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + '../escaped.txt': strToU8('escaped') + }) + const target = path.join(root, 'target') + + await expect(extractSkillArchive(archivePath, target)).rejects.toThrow('invalid path') + expect(fs.existsSync(path.join(root, 'escaped.txt'))).toBe(false) + }) + + it('rejects archives whose declared output exceeds the total limit', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'one.txt': new Uint8Array(8), + 'two.txt': new Uint8Array(8) + }) + + await expect( + extractSkillArchive(archivePath, path.join(root, 'target'), { + maxExtractedBytes: 12 + }) + ).rejects.toThrow('total extracted size limit') + }) + + it('rejects oversized entries before their content is written', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'large.txt': new Uint8Array(16) + }) + const target = path.join(root, 'target') + + await expect(extractSkillArchive(archivePath, target, { maxEntryBytes: 8 })).rejects.toThrow( + 'entry exceeds' + ) + expect(fs.existsSync(path.join(target, 'large.txt'))).toBe(false) + }) + + it('rejects suspicious expansion ratios above the exempt size', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'repeated.bin': new Uint8Array(4096) + }) + + await expect( + extractSkillArchive(archivePath, path.join(root, 'target'), { + compressionRatioExemptBytes: 0, + maxCompressionRatio: 2 + }) + ).rejects.toThrow('compression ratio limit') + }) + + it('rejects duplicate normalized paths', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'Example/SKILL.md': strToU8('one'), + 'example/skill.md': strToU8('two') + }) + + await expect(extractSkillArchive(archivePath, path.join(root, 'target'))).rejects.toThrow( + 'duplicate paths' + ) + }) + + it('rejects paths that create Windows alternate streams or device files', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'scripts/output.txt:payload': strToU8('one'), + 'NUL.txt': strToU8('two') + }) + + await expect(extractSkillArchive(archivePath, path.join(root, 'target'))).rejects.toThrow( + 'non-portable path' + ) + }) + + it('allows safe names that merely start with two dots', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + '..notes/SKILL.md': strToU8('notes') + }) + const target = path.join(root, 'target') + + await extractSkillArchive(archivePath, target) + + expect(fs.readFileSync(path.join(target, '..notes', 'SKILL.md'), 'utf8')).toBe('notes') + }) + + it('rejects archives that exceed the entry limit', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'one.txt': strToU8('one'), + 'two.txt': strToU8('two') + }) + + await expect( + extractSkillArchive(archivePath, path.join(root, 'target'), { maxEntries: 1 }) + ).rejects.toThrow('too many entries') + }) + + it('rejects compressed input above the configured byte limit', async () => { + const root = createTemporaryDirectory() + const archivePath = writeArchive(root, { + 'SKILL.md': strToU8('# Example') + }) + + await expect( + extractSkillArchive(archivePath, path.join(root, 'target'), { maxArchiveBytes: 1 }) + ).rejects.toThrow('ZIP file too large') + }) +}) diff --git a/test/main/skill/archiveDownload.test.ts b/test/main/skill/archiveDownload.test.ts new file mode 100644 index 0000000000..97724dc90a --- /dev/null +++ b/test/main/skill/archiveDownload.test.ts @@ -0,0 +1,127 @@ +import { mkdtemp, readFile, rm, stat } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { downloadSkillArchive } from '@/skill/archiveDownload' + +const temporaryDirectories: string[] = [] + +async function temporaryDestination(): Promise { + const directory = await mkdtemp(path.join(os.tmpdir(), 'deepchat-skill-download-')) + temporaryDirectories.push(directory) + return path.join(directory, 'skill.zip') +} + +function streamingResponse( + chunks: readonly string[], + headers: Record = {} +): Response { + return new Response( + new ReadableStream({ + start(controller) { + for (const chunk of chunks) controller.enqueue(Buffer.from(chunk)) + controller.close() + } + }), + { status: 200, headers: { 'content-type': 'application/zip', ...headers } } + ) +} + +afterEach(async () => { + await Promise.all( + temporaryDirectories.splice(0).map((directory) => rm(directory, { recursive: true })) + ) +}) + +describe('Skill archive download', () => { + it('streams a bounded archive directly to a private destination', async () => { + const destination = await temporaryDestination() + const fetchImpl = vi.fn(async () => + streamingResponse(['zip-', 'bytes'], { 'content-length': '9' }) + ) + + await downloadSkillArchive('https://skills.example/archive.zip', destination, { + maxBytes: 16, + timeoutMs: 5_000, + fetchImpl + }) + + expect(await readFile(destination, 'utf8')).toBe('zip-bytes') + if (process.platform !== 'win32') { + expect((await stat(destination)).mode & 0o777).toBe(0o600) + } + expect(fetchImpl).toHaveBeenCalledWith( + new URL('https://skills.example/archive.zip'), + expect.objectContaining({ redirect: 'manual' }) + ) + }) + + it('enforces the cumulative byte limit and removes partial downloads', async () => { + const destination = await temporaryDestination() + + await expect( + downloadSkillArchive('https://skills.example/archive.zip', destination, { + maxBytes: 8, + timeoutMs: 5_000, + fetchImpl: async () => streamingResponse(['12345', '6789']) + }) + ).rejects.toThrow('8-byte download limit') + await expect(stat(destination)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('rejects invalid or oversized declared lengths before creating a file', async () => { + const invalidDestination = await temporaryDestination() + const oversizedDestination = await temporaryDestination() + + await expect( + downloadSkillArchive('https://skills.example/invalid.zip', invalidDestination, { + maxBytes: 8, + timeoutMs: 5_000, + fetchImpl: async () => streamingResponse(['zip'], { 'content-length': '1e3' }) + }) + ).rejects.toThrow('Content-Length is invalid') + await expect( + downloadSkillArchive('https://skills.example/large.zip', oversizedDestination, { + maxBytes: 8, + timeoutMs: 5_000, + fetchImpl: async () => streamingResponse(['zip'], { 'content-length': '9' }) + }) + ).rejects.toThrow('8-byte download limit') + await expect(stat(invalidDestination)).rejects.toMatchObject({ code: 'ENOENT' }) + await expect(stat(oversizedDestination)).rejects.toMatchObject({ code: 'ENOENT' }) + }) + + it('follows bounded redirects without permitting an HTTPS downgrade', async () => { + const destination = await temporaryDestination() + const fetchImpl = vi + .fn() + .mockResolvedValueOnce( + new Response(null, { + status: 302, + headers: { location: 'https://cdn.example/skill.zip' } + }) + ) + .mockResolvedValueOnce(streamingResponse(['zip'])) + + await downloadSkillArchive('https://skills.example/archive.zip', destination, { + maxBytes: 8, + timeoutMs: 5_000, + fetchImpl + }) + expect(fetchImpl).toHaveBeenCalledTimes(2) + + const downgradeDestination = await temporaryDestination() + await expect( + downloadSkillArchive('https://skills.example/archive.zip', downgradeDestination, { + maxBytes: 8, + timeoutMs: 5_000, + fetchImpl: async () => + new Response(null, { + status: 302, + headers: { location: 'http://cdn.example/skill.zip' } + }) + }) + ).rejects.toThrow('HTTPS downgrade') + await expect(stat(downgradeDestination)).rejects.toMatchObject({ code: 'ENOENT' }) + }) +}) diff --git a/test/main/skill/skillService.test.ts b/test/main/skill/skillService.test.ts index 5f376bf945..89bddc0d96 100644 --- a/test/main/skill/skillService.test.ts +++ b/test/main/skill/skillService.test.ts @@ -27,6 +27,9 @@ const discoveryWorkerMock = vi.hoisted(() => ({ })) const publishDeepchatEventMock = vi.hoisted(() => vi.fn()) +const skillArchiveMock = vi.hoisted(() => ({ + extractSkillArchive: vi.fn() +})) // Mock external dependencies vi.mock('electron', () => ({ @@ -134,10 +137,6 @@ vi.mock('gray-matter', () => { } }) -vi.mock('fflate', () => ({ - unzipSync: vi.fn() -})) - vi.mock('node:child_process', () => ({ execFile: vi.fn( ( @@ -168,12 +167,12 @@ vi.mock('@shared/logger', () => ({ })) vi.mock('../../../src/main/skill/discoveryWorker', () => discoveryWorkerMock) +vi.mock('../../../src/main/skill/archive', () => skillArchiveMock) // Import mocked modules import fs from 'fs' import path from 'path' import matter from 'gray-matter' -import { unzipSync } from 'fflate' import { execFile } from 'node:child_process' import { randomUUID } from 'node:crypto' import logger from '@shared/logger' @@ -336,6 +335,7 @@ describe('SkillService', () => { // Setup default mocks ;(fs.existsSync as Mock).mockReturnValue(true) ;(fs.mkdirSync as Mock).mockReturnValue(undefined) + ;(fs.mkdtempSync as Mock).mockReturnValue('/mock/temp/deepchat-skill-123') ;(fs.readdirSync as Mock).mockReturnValue([]) ;(fs.statSync as Mock).mockReturnValue({ isFile: () => true, @@ -372,6 +372,7 @@ describe('SkillService', () => { new Error('worker unavailable') ) discoveryWorkerMock.logSkillDiscoveryWorkerWarnings.mockImplementation(() => {}) + skillArchiveMock.extractSkillArchive.mockResolvedValue(undefined) ;(skillSessionStatePort.hasNewSession as Mock).mockResolvedValue(false) ;(skillSessionStatePort.repairImportedLegacySessionSkills as Mock).mockImplementation( async (conversationId: string) => newSessionActiveSkillsStore.get(conversationId) ?? [] @@ -2297,14 +2298,31 @@ describe('SkillService', () => { // Temp dir exists return true }) - ;(fs.readFileSync as Mock).mockReturnValue(new Uint8Array([0x50, 0x4b, 0x03, 0x04])) - ;(unzipSync as Mock).mockReturnValue({}) ;(fs.readdirSync as Mock).mockReturnValue([]) const result = await skillService.installFromZip('/path/to/skill.zip') expect(result.success).toBe(false) expect(result.error).toContain('SKILL.md not found') + expect(skillArchiveMock.extractSkillArchive).toHaveBeenCalledWith( + '/path/to/skill.zip', + '/mock/temp/deepchat-skill-123', + { maxArchiveBytes: SKILL_CONFIG.ZIP_MAX_SIZE } + ) + }) + + it('cleans the temporary directory when bounded extraction fails', async () => { + skillArchiveMock.extractSkillArchive.mockRejectedValueOnce( + new Error('ZIP archive exceeds the total extracted size limit') + ) + + const result = await skillService.installFromZip('/path/to/skill.zip') + + expect(result).toMatchObject({ success: false, errorCode: 'io_error' }) + expect(fs.rmSync).toHaveBeenCalledWith('/mock/temp/deepchat-skill-123', { + recursive: true, + force: true + }) }) }) diff --git a/test/main/skill/skillServiceAgentScopes.test.ts b/test/main/skill/skillServiceAgentScopes.test.ts index 29a633dc19..056acc166a 100644 --- a/test/main/skill/skillServiceAgentScopes.test.ts +++ b/test/main/skill/skillServiceAgentScopes.test.ts @@ -367,6 +367,70 @@ describe('SkillService Agent scopes', () => { expect(fs.existsSync(writerRoot)).toBe(false) }) + it('shares the bundled CLI Skill read-only without copying it into Agent roots', async () => { + agents.push({ id: 'writer' }) + vi.mocked(app.getAppPath).mockReturnValue(temporaryRoot) + const resourceRoot = writeSkill( + path.join(temporaryRoot, 'resources', 'skills'), + 'deepchat-cli', + '# Bundled CLI' + ) + + await service.installBuiltinSkills() + const catalog = await service.getUnifiedSkillCatalog('writer') + + expect(catalog).toEqual([ + expect.objectContaining({ + name: 'deepchat-cli', + skillRoot: resourceRoot, + canonicalPath: resourceRoot, + sourceType: 'builtin', + mutable: false, + readOnly: true + }) + ]) + expect( + fs.existsSync(path.join(resolveAgentSkillsRoot(skillsRoot, 'writer'), 'deepchat-cli')) + ).toBe(false) + await expect(service.uninstallSkillForAgent('writer', 'deepchat-cli')).resolves.toMatchObject({ + success: false, + error: expect.stringContaining('Read-only bundled Skills') + }) + expect(fs.existsSync(path.join(resourceRoot, 'SKILL.md'))).toBe(true) + }) + + it('keeps an Agent-owned Skill when it collides with a read-only bundled name', async () => { + agents.push({ id: 'writer' }) + vi.mocked(app.getAppPath).mockReturnValue(temporaryRoot) + writeSkill(path.join(temporaryRoot, 'resources', 'skills'), 'deepchat-cli', '# Bundled CLI') + const writerRoot = resolveAgentSkillsRoot(skillsRoot, 'writer') + const customRoot = writeSkill(writerRoot, 'deepchat-cli', '# Agent custom CLI') + + await service.installBuiltinSkills() + const catalog = await service.getUnifiedSkillCatalog('writer') + + expect(catalog).toEqual([ + expect.objectContaining({ + name: 'deepchat-cli', + skillRoot: customRoot, + sourceType: 'created', + mutable: true + }) + ]) + expect(catalog[0]).not.toHaveProperty('readOnly', true) + + await expect(service.uninstallSkillForAgent('writer', 'deepchat-cli')).resolves.toMatchObject({ + success: true + }) + await expect(service.getUnifiedSkillCatalog('writer')).resolves.toEqual([ + expect.objectContaining({ + name: 'deepchat-cli', + readOnly: true, + mutable: false + }) + ]) + }) + it('preserves a preexisting independent Agent root instead of overwriting it', async () => { agents.push({ id: 'writer' }) const writerRoot = resolveAgentSkillsRoot(skillsRoot, 'writer') diff --git a/test/main/tool/agentTools/agentBashHandler.test.ts b/test/main/tool/agentTools/agentBashHandler.test.ts index 821fb89e19..4a49e4156a 100644 --- a/test/main/tool/agentTools/agentBashHandler.test.ts +++ b/test/main/tool/agentTools/agentBashHandler.test.ts @@ -125,6 +125,99 @@ describe('AgentBashHandler', () => { expect(result.output).toContain('Exit Code: 2') }) + it('creates a scoped command environment only after command approval', async () => { + const permissionService = new CommandPermissionService() + permissionService.approve('conv-1', 'deepchat model', false) + const commandEnvironment = { + createEnvironment: vi.fn(() => ({ + variables: { DEEPCHAT_CLI_AGENT_TOKEN: 'scoped-token' }, + prependPath: ['/bundled/cli'], + preserveCommand: true + })) + } + const handler = new AgentBashHandler( + ['/workspace'], + { get: () => undefined }, + permissionService, + commandEnvironment + ) + const prepareCommand = vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ + originalCommand: 'deepchat model invoke --prompt hello', + command: 'deepchat model invoke --prompt hello', + env: { DEEPCHAT_CLI_AGENT_TOKEN: 'scoped-token' }, + rewritten: false, + rtkApplied: false, + rtkMode: 'bypass' + }) + vi.spyOn(handler as never, 'runShellProcess' as never).mockResolvedValue({ + kind: 'completed', + output: 'ok', + exitCode: 0, + timedOut: false, + offloaded: false + }) + + await handler.executeCommand( + { + command: 'deepchat model invoke --prompt hello', + description: 'Invoke model' + }, + { + conversationId: 'conv-1', + env: { + PATH: ['/controlled/bin', '/shared/bin'].join(path.delimiter), + CONTROLLED_VALUE: 'preserved' + } + } + ) + + expect(commandEnvironment.createEnvironment).toHaveBeenCalledWith( + 'conv-1', + 'deepchat model invoke --prompt hello' + ) + expect(prepareCommand).toHaveBeenCalledWith( + 'deepchat model invoke --prompt hello', + expect.objectContaining({ + DEEPCHAT_CLI_AGENT_TOKEN: 'scoped-token', + CONTROLLED_VALUE: 'preserved' + }), + true + ) + const preparedEnvironment = prepareCommand.mock.calls[0]?.[1] as Record + expect(preparedEnvironment.PATH?.split(path.delimiter).slice(0, 3)).toEqual([ + '/bundled/cli', + '/controlled/bin', + '/shared/bin' + ]) + }) + + it('does not issue a scoped environment while command approval is pending', async () => { + const commandEnvironment = { + createEnvironment: vi.fn(() => ({ + variables: {}, + prependPath: [], + preserveCommand: false + })) + } + const handler = new AgentBashHandler( + ['/workspace'], + { get: () => undefined }, + new CommandPermissionService(), + commandEnvironment + ) + + await expect( + handler.executeCommand( + { + command: 'deepchat model invoke --prompt hello', + description: 'Invoke model' + }, + { conversationId: 'conv-1' } + ) + ).rejects.toMatchObject({ name: 'Error', message: 'Command permission required' }) + expect(commandEnvironment.createEnvironment).not.toHaveBeenCalled() + }) + it('does not fall back when the rewritten command times out', async () => { const handler = new AgentBashHandler( ['/workspace'], diff --git a/test/main/tool/permission/commandPermissionService.test.ts b/test/main/tool/permission/commandPermissionService.test.ts index 7bd34223ae..bc3c021938 100644 --- a/test/main/tool/permission/commandPermissionService.test.ts +++ b/test/main/tool/permission/commandPermissionService.test.ts @@ -32,6 +32,93 @@ describe('CommandPermissionService', () => { expect(service.extractCommandSignature('git pull origin main')).toBe('git pull') expect(service.extractCommandSignature('rm -rf /')).toBe('rm -rf /') }) + + it('keeps deepchat outside the implicit safe-command set', () => { + const service = new CommandPermissionService() + const result = service.checkPermission('conv-1', 'deepchat model invoke --prompt hello') + + expect(result.allowed).toBe(false) + expect(result.reason).toBe('permission') + expect(result.signature).toBe('deepchat model') + }) + + it.each([ + 'cat notes.txt > copied.txt', + 'cat notes.txt 2>> errors.log', + 'cat < notes.txt', + 'ls | sort', + 'ls && touch changed.txt', + 'ls\ntouch changed.txt', + 'echo $(touch changed.txt)', + 'echo `touch changed.txt`', + 'sleep 1 & touch changed.txt' + ])('requires an exact approval for shell control syntax in %j', (command) => { + const service = new CommandPermissionService() + const result = service.checkPermission('conv-1', command) + + expect(result.allowed).toBe(false) + expect(result.reason).toBe('permission') + expect(result.risk.level).toBe('critical') + expect(result.signature).toMatch(/^shell:[a-f0-9]{64}$/) + }) + + it.each([ + 'echo "a > b"', + "grep 'a&b' notes.txt", + "echo '\$(touch changed.txt)'", + 'echo escaped\\>value' + ])('does not treat quoted or escaped shell characters as control syntax in %j', (command) => { + const service = new CommandPermissionService() + const result = service.checkPermission('conv-1', command) + + expect(result.allowed).toBe(true) + expect(result.reason).toBe('whitelist') + expect(result.risk.level).toBe('low') + expect(result.signature).not.toMatch(/^shell:/) + }) + + it('detects command substitution inside double quotes', () => { + const service = new CommandPermissionService() + const result = service.checkPermission('conv-1', 'echo "$(touch changed.txt)"') + + expect(result.allowed).toBe(false) + expect(result.risk.level).toBe('critical') + expect(result.signature).toMatch(/^shell:[a-f0-9]{64}$/) + }) + + it('exposes shell-control classification to trusted command adapters', () => { + const service = new CommandPermissionService() + + expect(service.hasShellControlSyntax('deepchat model invoke')).toBe(false) + expect(service.hasShellControlSyntax('deepchat model invoke > output.txt')).toBe(true) + }) + + it('does not let a broad command approval authorize a redirected command', () => { + const service = new CommandPermissionService() + service.approve('conv-1', 'deepchat model', false) + + const redirected = service.checkPermission( + 'conv-1', + 'deepchat model invoke --prompt hello > output.txt' + ) + const original = service.checkPermission('conv-1', 'deepchat model invoke --prompt hello') + + expect(redirected.allowed).toBe(false) + expect(redirected.signature).toMatch(/^shell:[a-f0-9]{64}$/) + expect(original.allowed).toBe(true) + }) + + it('allows only the exact shell expression that was approved', () => { + const service = new CommandPermissionService() + const command = 'deepchat model invoke --prompt hello > output.txt' + const signature = service.extractCommandSignature(command) + service.approve('conv-1', signature, false) + + expect(service.checkPermission('conv-1', command).allowed).toBe(true) + expect( + service.checkPermission('conv-1', 'deepchat model invoke --prompt hello > other.txt').allowed + ).toBe(false) + }) }) describe('CommandPermissionCache', () => { diff --git a/test/main/tool/toolPermissionBroker.test.ts b/test/main/tool/toolPermissionBroker.test.ts index 19d6f37c7e..7bc00a35c9 100644 --- a/test/main/tool/toolPermissionBroker.test.ts +++ b/test/main/tool/toolPermissionBroker.test.ts @@ -24,6 +24,25 @@ describe('ToolPermissionBroker', () => { await expect(second).resolves.toEqual({ allowed: true }) }) + it('does not lose an MCP App decision resolved inside the request callback', async () => { + const broker = new ToolPermissionBroker() + const context = { + conversationId: 'conversation', + serverId: 'server', + serverName: 'fixture', + toolName: 'read', + arguments: { path: '/tmp/example' }, + permissionType: 'read' as const, + permissionMode: 'default' as const + } + + await expect( + broker.requestAppDecision(context, (request) => { + expect(broker.approve(request.requestId!, context.conversationId)).toBe(true) + }) + ).resolves.toEqual({ allowed: true }) + }) + it('does not reuse a model approval for changed arguments or an MCP App source', () => { const broker = new ToolPermissionBroker() const base = { diff --git a/test/renderer/stores/cliApproval.test.ts b/test/renderer/stores/cliApproval.test.ts new file mode 100644 index 0000000000..7e8986feb9 --- /dev/null +++ b/test/renderer/stores/cliApproval.test.ts @@ -0,0 +1,164 @@ +import { flushPromises, mount } from '@vue/test-utils' +import { defineComponent } from 'vue' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +describe('useCliApprovalStore', () => { + beforeEach(() => { + vi.resetModules() + }) + + it('queues targeted requests, resolves once, and removes closed requests', async () => { + let requested: ((payload: Record) => void) | undefined + let closed: ((payload: { requestId: string }) => void) | undefined + const resolve = vi.fn(async () => false) + vi.doMock('@api/ApprovalClient', () => ({ + createApprovalClient: () => ({ + onRequested: (listener: typeof requested) => { + requested = listener + return vi.fn() + }, + onClosed: (listener: typeof closed) => { + closed = listener + return vi.fn() + }, + resolve + }) + })) + vi.doMock('pinia', async () => { + const actual = await vi.importActual('pinia') + return { ...actual, defineStore: (_id: string, setup: () => unknown) => setup } + }) + + const { useCliApprovalStore } = await import('@/stores/cliApproval') + let store: ReturnType | undefined + const Harness = defineComponent({ + setup() { + store = useCliApprovalStore() + return () => null + } + }) + const wrapper = mount(Harness) + + requested?.({ + requestId: 'approval-request-1234', + operation: 'skills.installFromUrl', + effect: 'supply-chain', + principal: 'human', + expiresAt: Date.now() + 60_000, + displayData: { host: 'example.com' } + }) + requested?.({ + requestId: 'approval-request-5678', + operation: 'mcp.addPublic', + effect: 'security-config', + principal: 'human', + expiresAt: Date.now() + 60_000 + }) + await flushPromises() + + expect(store?.request.value?.requestId).toBe('approval-request-1234') + await store?.approve() + expect(resolve).toHaveBeenCalledWith('approval-request-1234', 'approved') + expect(store?.request.value?.requestId).toBe('approval-request-5678') + + closed?.({ requestId: 'approval-request-5678' }) + await flushPromises() + expect(store?.isOpen.value).toBe(false) + wrapper.unmount() + }) + + it('keeps a request visible when renderer resolution fails so the user can retry', async () => { + let requested: ((payload: Record) => void) | undefined + const resolve = vi + .fn() + .mockRejectedValueOnce(new Error('IPC unavailable')) + .mockResolvedValue(true) + vi.doMock('@api/ApprovalClient', () => ({ + createApprovalClient: () => ({ + onRequested: (listener: typeof requested) => { + requested = listener + return vi.fn() + }, + onClosed: () => vi.fn(), + resolve + }) + })) + vi.doMock('pinia', async () => { + const actual = await vi.importActual('pinia') + return { ...actual, defineStore: (_id: string, setup: () => unknown) => setup } + }) + const error = vi.spyOn(console, 'error').mockImplementation(() => undefined) + + const { useCliApprovalStore } = await import('@/stores/cliApproval') + let store: ReturnType | undefined + const wrapper = mount( + defineComponent({ + setup() { + store = useCliApprovalStore() + return () => null + } + }) + ) + requested?.({ + requestId: 'approval-request-1234', + operation: 'providers.setCredential', + effect: 'credential', + principal: 'human', + expiresAt: Date.now() + 60_000 + }) + await flushPromises() + + await store?.deny() + expect(store?.request.value?.requestId).toBe('approval-request-1234') + await store?.deny() + expect(store?.isOpen.value).toBe(false) + + wrapper.unmount() + error.mockRestore() + }) + + it('fails closed when the bounded renderer queue is full', async () => { + let requested: ((payload: Record) => void) | undefined + const resolve = vi.fn(async () => true) + vi.doMock('@api/ApprovalClient', () => ({ + createApprovalClient: () => ({ + onRequested: (listener: typeof requested) => { + requested = listener + return vi.fn() + }, + onClosed: () => vi.fn(), + resolve + }) + })) + vi.doMock('pinia', async () => { + const actual = await vi.importActual('pinia') + return { ...actual, defineStore: (_id: string, setup: () => unknown) => setup } + }) + + const { useCliApprovalStore } = await import('@/stores/cliApproval') + let store: ReturnType | undefined + const wrapper = mount( + defineComponent({ + setup() { + store = useCliApprovalStore() + return () => null + } + }) + ) + for (let index = 0; index < 33; index += 1) { + requested?.({ + requestId: `approval-request-${String(index).padStart(4, '0')}`, + operation: 'skills.installFromUrl', + effect: 'supply-chain', + principal: 'human', + expiresAt: Date.now() + 60_000 + }) + } + await flushPromises() + + expect(resolve).toHaveBeenCalledOnce() + expect(resolve).toHaveBeenCalledWith('approval-request-0032', 'denied') + expect(store?.request.value?.requestId).toBe('approval-request-0000') + wrapper.unmount() + }) +}) diff --git a/test/setup.renderer.ts b/test/setup.renderer.ts index 394e265d71..f6efa15571 100644 --- a/test/setup.renderer.ts +++ b/test/setup.renderer.ts @@ -1,5 +1,5 @@ import { vi, beforeEach, afterEach } from 'vitest' -import { config } from '@vue/test-utils' +import { config, enableAutoUnmount } from '@vue/test-utils' const createDefaultModelConfig = () => ({ maxTokens: 4096, @@ -569,3 +569,7 @@ afterEach(() => { vi.useRealTimers() vi.restoreAllMocks() }) + +// Vitest runs cleanup hooks in reverse registration order. Register auto-unmount +// last so components dispose while their mocked dependencies are still intact. +enableAutoUnmount(afterEach) diff --git a/tsconfig.node.json b/tsconfig.node.json index c10fc6d185..c87a01691e 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -2,6 +2,7 @@ "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", "include": [ "electron.vite.config.*", + "src/cli/**/*", "src/main/**/*", "src/preload/**/*", "src/shared/**/*"